Re: [eclipse-users] Matching

From: Joachim Schimpf (Independent Contractor) <jschimpf_at_cisco.com>
Date: Wed, 09 May 2007 12:42:22 +0100
Lutz, Charles D wrote:
> To be honest, the outputs of both of these variants are not totally 
> clear to me. First off,
> 
> what does it “mean” to have “f(a, X)” inside of the head clause? Apart 
> from saying p1
> 
> or p2 is a clause of arity 1, whose argument is another clause of arity 
> 2, what is the
> 
> “practical” meaning of it?

We have to be careful with the terminology:

- we have here two _predicates_ (p1/1 and p2/1),
   i.e. things that can be true of false.

- each predicate is defined by (one or more) _clauses_.
   Here, we only have one clause each for p1/1 and p2/1.

Since there are no clauses for f/2, there is no predicate f/2,
i.e. it doesn't make sense to ask whether f/2 is true or false.

f(a,X) is therefore simply a data structure, more precisely a
compound term with two subterms.


Now, a clause like

p1(f(a,X)) :- ...

means that it provides a definition for the truth of p1/1, but it
applies only to the case that the argument of p1/1 is a data structure
of the form f(a,X).

Incidentally, this is equivalent to having written

p1(Arg) :- Arg = f(a,X), ...


To understand what happens when you ask the query (your example 24)

?- p1(f(a,b)).

in the presence of the definition:

p1(Arg) :- Arg = f(a,X), writeln(X).

you can simply "macro-expand" the definition, by substituting in your
query the left-hand side of the defining clause with the right hand
side, and filling in the actual value for Arg.  This gives

?- f(a,b) = f(a,X), writeln(X).

and this should explain why it writes "b".


Now look at your query 23, whose expansion yields

?- f(A,b) = f(a,X) , writeln(X).

This still writes "b", but since unification (=) works both ways,
it also binds the variable A to a.


The "matching clauses" work the same, except that they use a one-way
variant of unification, which only allows variables on the right hand
side to be bound (and fails otherwise).


Apart from the matching clauses (which are ECLiPSe-specific), this is
standard Prolog mechanism which you can find in quite compact form in
e.g. the text book like Bratko, or in the ECLiPSe book by Apt/Wallace,
or have a look at some of the online resources at
www.eclipse-clp.org/links.html

It would be great to beef up the ECLiPSe tutorial and make it more self
contained.  If someone feels inspired, the sources are available at
SourceForge!


Best regards,
Joachim
Received on Wed May 09 2007 - 12:42:48 CEST

This archive was generated by hypermail 2.2.0 : Thu Feb 02 2012 - 02:31:58 CET