Hi Doug,

> Hmmm... the clauses seem paired in like so, in the or/2 reference, like
> 
>    (or
>       ((equal 3 @X) (equal @X 4))
>       ((equal 7 @X) (equal @X 7)) )
> 
> 
> When I similarly pair the clauses of or/2:
> 
> (be foo (@N) (or ((a @N) (b @N))))

Right. This is how Pilog (Prolog) works. ;-)


The most fundamental rule is that all clauses in a rule are combined by
an implicit AND:

   # 'b' AND 'c' must be true for 'a' to succeed
   (be a (@X @Y)
      (b @X)
      (c @Y) )


To get an OR, you write several rules:

   # ('b' AND 'c') OR ('d' AND 'e') must be true for 'a' to succeed
   (be a (@X @Y)
      (b @X)
      (c @Y) )

   (be a (@X @Y)
      (d @X)
      (e @Y) )


Therefore, the 'or' predicate is not really necessary. It is just a
convenience, to avoid defining multiple rules. But from the above it
follows that the each argument clause to 'or' must itself be a list of
clauses:

   # ('b' AND 'c') OR ('d' AND 'e') must be true for 'a' to succeed
   (be a (@X @Y)
      (or
         ((b @X) (c @Y))
         ((d @X) (e @Y)) ) )


(From your next mail):

> Alex, would it be possible to give pilog an and/2 rule similar to the
> or/2 rule that pilog has now?

Now it should be clear that an 'and/2' predicate is superfluous, because
AND is implicit in all Prolog rules.

Cheers,
- Alex
-- 
UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe

Reply via email to