# Re: (< @X 18) doesn't behave as expected with pilog (SOLVED: short

Hi Alex,

I've just created an account on the wiki however I think I can't add something in the reference part. I think that this how-to could fit very well here:

http://software-lab.de/doc/ref.html#pilog

to illustrate the last part which starts with " Pilog can be called from Lisp and vice versa:"

After the last sentence and just before the horizontal rule, it could be word like this:

=====

To illustrate this, let's say that you have those two facts in a Pilog database:

(be age (Paul 19) )
(be age (Kate 17) )

and that you want to find the person under 18.

In full Prolog you may have written something like this:

underage(X) :- age(X,Y), Y < 18.

however in Pilog the following rule:

(be underage (@X)
(age @X @Y)
(< @Y 18) )

won't work and the query:

(? (underage @X) )

will yield to 'NIL' instead of the expected result '@X=Kate' .

The reason is that '<' (less than) is not Pilog function but only a Lisp one in PicoLisp.

In order to embed a Lisp expression in a Pilog, you must use '^' operator. It causes the rest of the expression to be taken as Lisp. Then, inside the Lisp code you can in turn access Pilog-bindings with the '->' function.

Hence, in our case the Prolog rule above translates as:

(be underage (@X)
(age @X @Y)
(^ @ (< (-> @Y) 18)) )

In '(^ @ (< (-> @Y) 18))', '@' is an anonymous variable used to get the result. If you need to access the result you can bind it to a defined variable like in '(^ @B (+ (-> @A) 7))' where '@B' is now bound to '@A + 7'.

You may prefer to define your own Pilog predicate in this particular case. Let's say that to avoid confusion, you want to create a Pilog predicate call 'less_than' to mimic the Lisp function '<':

(be less_than (@A @B)
(^ @ (< (-> @A) (-> @B) )))

Then the Pilog rule becomes:

(be underage_1 (@X)
(age @X @Y)
(less_than @Y 18) )

and now:

(? (underage @X) )

yields to:

@X=Kate

which is the expected result.

=====

Hope this helps.

Best,
Eric

Le 13/11/2016 à 15:47, Alexander Burger a écrit :
You can't be too young, I think. You could write it, and perhaps others
may improve it;)