Re: JESS: defquery parameters

2009-11-16 Thread Wolfgang Laun
As a workaround, you can use a lambda for smuggling the list into the query:

(bind ?eq-pqr (lambda (?arg) (return (eq (list p q r) ?arg))) )

(defquery q1
 (declare (variables ?pa ?lam))
 (myfact (a ?pa) (b ?b) (c $?v :(?lam $?v))
 )
)

-W


On Fri, Nov 13, 2009 at 7:04 PM, Ernest Friedman-Hill ejfr...@sandia.govwrote:

 Hmmm. Indeed, you're right, and it's a limitation of the implementation,
 not easily lifted. I'll add it to the issues list.



 On Nov 13, 2009, at 12:20 PM, Michael Welter wrote:

  Can't a list be passed to defquery?

 (deftemplate myfact
  (slot a)
  (slot b)
  (multislot c)
 )

 (deffacts f1
  (myfact (a 1)(b 1)(c (create$ p q c)))
  (myfact (a 1)(b 2)(c (create$ p q r)))
  (myfact (a 1)(b 3)(c (create$ p q z)))
 )

 (defquery q1
  (declare (variables ?pa ?pc))  ; $?pc throws an error
  (myfact
   (a ?pa)
   (b ?b)
   (c $?v:(eq $?v $?pc)) ; won't work
   ;(c $?v:(eq (nth$ 1 $?v) ?pc)) ; works
  )
 )

 (defrule r1
  (initial-fact)
 =
  (try
   (bind ?result (run-query* q1 1 (create$ p q r)))
  catch
   (printout t query failed crlf)
  )
  (while (?result next) do
   (printout t
 b:  (?result getString b)
   crlf)
  )
 )


 Thanks


 
 To unsubscribe, send the words 'unsubscribe jess-users y...@address.com'
 in the BODY of a message to majord...@sandia.gov, NOT to the list
 (use your own address!) List problems? Notify owner-jess-us...@sandia.gov
 .
 


 -
 Ernest Friedman-Hill
 Informatics  Decision Sciences  Phone: (925) 294-2154
 Sandia National Labs
 PO Box 969, MS 9012ejfr...@sandia.gov
 Livermore, CA 94550 http://www.jessrules.com






 
 To unsubscribe, send the words 'unsubscribe jess-users y...@address.com'
 in the BODY of a message to majord...@sandia.gov, NOT to the list
 (use your own address!) List problems? Notify owner-jess-us...@sandia.gov.
 




Re: JESS: defquery parameters

2009-11-16 Thread Wolfgang Laun
Given this deffunction:

(deffunction list2lambda ($?list)
(return (eval (str-cat (lambda (?arg) (return (eq (list 
 (implode$ $?list)
 ) ?arg))) 

the run-query* call could even be written as simply as

  (run-query* q1 1 (list2lambda p q r ))

Ah, the beauty of Lisp ;-)
-W



On Mon, Nov 16, 2009 at 8:45 AM, Wolfgang Laun wolfgang.l...@gmail.comwrote:

 As a workaround, you can use a lambda for smuggling the list into the
 query:

 (bind ?eq-pqr (lambda (?arg) (return (eq (list p q r) ?arg))) )

 (defquery q1

  (declare (variables ?pa ?lam))
  (myfact (a ?pa) (b ?b) (c $?v :(?lam $?v))
  )
 )

 -W


 On Fri, Nov 13, 2009 at 7:04 PM, Ernest Friedman-Hill 
 ejfr...@sandia.govwrote:

 Hmmm. Indeed, you're right, and it's a limitation of the implementation,
 not easily lifted. I'll add it to the issues list.



 On Nov 13, 2009, at 12:20 PM, Michael Welter wrote:

  Can't a list be passed to defquery?

 (deftemplate myfact
  (slot a)
  (slot b)
  (multislot c)
 )

 (deffacts f1
  (myfact (a 1)(b 1)(c (create$ p q c)))
  (myfact (a 1)(b 2)(c (create$ p q r)))
  (myfact (a 1)(b 3)(c (create$ p q z)))
 )

 (defquery q1
  (declare (variables ?pa ?pc))  ; $?pc throws an error
  (myfact
   (a ?pa)
   (b ?b)
   (c $?v:(eq $?v $?pc)) ; won't work
   ;(c $?v:(eq (nth$ 1 $?v) ?pc)) ; works
  )
 )

 (defrule r1
  (initial-fact)
 =
  (try
   (bind ?result (run-query* q1 1 (create$ p q r)))
  catch
   (printout t query failed crlf)
  )
  (while (?result next) do
   (printout t
 b:  (?result getString b)
   crlf)
  )
 )


 Thanks


 
 To unsubscribe, send the words 'unsubscribe jess-users y...@address.com'
 in the BODY of a message to majord...@sandia.gov, NOT to the list
 (use your own address!) List problems? Notify
 owner-jess-us...@sandia.gov.
 


 -
 Ernest Friedman-Hill
 Informatics  Decision Sciences  Phone: (925) 294-2154
 Sandia National Labs
 PO Box 969, MS 9012ejfr...@sandia.gov
 Livermore, CA 94550 http://www.jessrules.com






 
 To unsubscribe, send the words 'unsubscribe jess-users y...@address.com'
 in the BODY of a message to majord...@sandia.gov, NOT to the list
 (use your own address!) List problems? Notify owner-jess-us...@sandia.gov
 .
 





Re: JESS: defquery parameters

2009-11-16 Thread Ernest Friedman-Hill

That is *really* clever. Sweet!

On Nov 16, 2009, at 10:59 AM, Wolfgang Laun wrote:


Given this deffunction:

(deffunction list2lambda ($?list)
(return (eval (str-cat (lambda (?arg) (return (eq (list 
 (implode$ $?list)
 ) ?arg))) 

the run-query* call could even be written as simply as

  (run-query* q1 1 (list2lambda p q r ))

Ah, the beauty of Lisp ;-)
-W



On Mon, Nov 16, 2009 at 8:45 AM, Wolfgang Laun wolfgang.l...@gmail.com 
 wrote:
As a workaround, you can use a lambda for smuggling the list into  
the query:


(bind ?eq-pqr (lambda (?arg) (return (eq (list p q r) ?arg))) )

(defquery q1

 (declare (variables ?pa ?lam))
 (myfact (a ?pa) (b ?b) (c $?v :(?lam $?v))
 )
)

-W


On Fri, Nov 13, 2009 at 7:04 PM, Ernest Friedman-Hill ejfr...@sandia.gov 
 wrote:
Hmmm. Indeed, you're right, and it's a limitation of the  
implementation, not easily lifted. I'll add it to the issues list.




On Nov 13, 2009, at 12:20 PM, Michael Welter wrote:

Can't a list be passed to defquery?

(deftemplate myfact
 (slot a)
 (slot b)
 (multislot c)
)

(deffacts f1
 (myfact (a 1)(b 1)(c (create$ p q c)))
 (myfact (a 1)(b 2)(c (create$ p q r)))
 (myfact (a 1)(b 3)(c (create$ p q z)))
)

(defquery q1
 (declare (variables ?pa ?pc))  ; $?pc throws an error
 (myfact
  (a ?pa)
  (b ?b)
  (c $?v:(eq $?v $?pc)) ; won't work
  ;(c $?v:(eq (nth$ 1 $?v) ?pc)) ; works
 )
)

(defrule r1
 (initial-fact)
=
 (try
  (bind ?result (run-query* q1 1 (create$ p q r)))
 catch
  (printout t query failed crlf)
 )
 (while (?result next) do
  (printout t
b:  (?result getString b)
  crlf)
 )
)


Thanks



To unsubscribe, send the words 'unsubscribe jess-users  
y...@address.com'

in the BODY of a message to majord...@sandia.gov, NOT to the list
(use your own address!) List problems? Notify owner-jess-us...@sandia.gov 
.



-
Ernest Friedman-Hill
Informatics  Decision Sciences  Phone: (925) 294-2154
Sandia National Labs
PO Box 969, MS 9012ejfr...@sandia.gov
Livermore, CA 94550 http://www.jessrules.com







To unsubscribe, send the words 'unsubscribe jess-users  
y...@address.com'

in the BODY of a message to majord...@sandia.gov, NOT to the list
(use your own address!) List problems? Notify owner-jess-us...@sandia.gov 
.







-
Ernest Friedman-Hill
Informatics  Decision Sciences  Phone: (925) 294-2154
Sandia National Labs
PO Box 969, MS 9012ejfr...@sandia.gov
Livermore, CA 94550 http://www.jessrules.com






To unsubscribe, send the words 'unsubscribe jess-users y...@address.com'
in the BODY of a message to majord...@sandia.gov, NOT to the list
(use your own address!) List problems? Notify owner-jess-us...@sandia.gov.




Re: JESS: defquery parameters

2009-11-13 Thread Ernest Friedman-Hill
Hmmm. Indeed, you're right, and it's a limitation of the  
implementation, not easily lifted. I'll add it to the issues list.



On Nov 13, 2009, at 12:20 PM, Michael Welter wrote:


Can't a list be passed to defquery?

(deftemplate myfact
 (slot a)
 (slot b)
 (multislot c)
)

(deffacts f1
 (myfact (a 1)(b 1)(c (create$ p q c)))
 (myfact (a 1)(b 2)(c (create$ p q r)))
 (myfact (a 1)(b 3)(c (create$ p q z)))
)

(defquery q1
 (declare (variables ?pa ?pc))  ; $?pc throws an error
 (myfact
   (a ?pa)
   (b ?b)
   (c $?v:(eq $?v $?pc)) ; won't work
   ;(c $?v:(eq (nth$ 1 $?v) ?pc)) ; works
 )
)

(defrule r1
 (initial-fact)
=
 (try
   (bind ?result (run-query* q1 1 (create$ p q r)))
 catch
   (printout t query failed crlf)
 )
 (while (?result next) do
   (printout t
 b:  (?result getString b)
   crlf)
 )
)


Thanks



To unsubscribe, send the words 'unsubscribe jess-users  
y...@address.com'

in the BODY of a message to majord...@sandia.gov, NOT to the list
(use your own address!) List problems? Notify owner-jess-us...@sandia.gov 
.




-
Ernest Friedman-Hill
Informatics  Decision Sciences  Phone: (925) 294-2154
Sandia National Labs
PO Box 969, MS 9012ejfr...@sandia.gov
Livermore, CA 94550 http://www.jessrules.com






To unsubscribe, send the words 'unsubscribe jess-users y...@address.com'
in the BODY of a message to majord...@sandia.gov, NOT to the list
(use your own address!) List problems? Notify owner-jess-us...@sandia.gov.