Home > Archive > Prolog > October 2004 > How does the operator-command works?
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
| Author |
How does the operator-command works?
|
|
| Tobias Mauderer 2004-10-01, 3:57 pm |
| Hello,
I have the following code-example:
%*************************
:- op(800, fx, if).
:- op(700, xfx, then).
:- op(300, xfy, or).
:- op(200, xfy, and).
fact(hall_wet).
fact(bathroom_dry).
if
hall_wet and bathroom_dry
then
problem_in_kitchen.
%*************************
I don't really understand the functionality of the operator-expression ("op"
at the
beginning of this example). I read in my book that the first parameter is
the precedence,
the sceond one the type (prefix, postfix...) and the last one the name. So
far, so good.
But...
How does it work? How does the compiler knows that "and" acts like an "and"
instead of
something else. How does he knows that "if hall_wet and bathroom_dry then
problem_in_kitchen." accomplish the desired action, only with these three
parameters in the
operator-definition???
I hope you understand what I mean...
Tobias
P.S.: I tried to post my question one time before, but it didn't work - I
don't hope that it appears twice...
| |
| Jens Kilian 2004-10-01, 3:57 pm |
| "Tobias Mauderer" <tobimau@gmx.de> writes:
> How does it work? How does the compiler knows that "and" acts like an "and"
> instead of
> something else. How does he knows that "if hall_wet and bathroom_dry then
> problem_in_kitchen." accomplish the desired action, only with these three
> parameters in the
> operator-definition???
Simple. It doesn't know.
op/3 defines a *syntactic* construct. Only I/O predicates like read/1 and
write/1 use the operator definitions. After your example has been read
by the system, it will be treated like (in fact, it is *identical* to)
the term
if(then(and(hall_wet, bathroom_dry), problem_in_kitchen)).
If you want to use these operators to define logical rules that can be
executed, you have to do one of two things:
- Write a meta-interpreter which understands the new operators; or
- define term expansion rules which convert the new operators to the
standard form for Prolog rules.
An example (untested) for the second approach would be
term_expansion(if(then(Precondition, Consequence)),
(Consequence :- TranslatedPrecondition)) :-
translate_precondition(Precondition, TranslatedPrecondition,true).
translate_precondition(and(A, B), T0,T) :-
!,
translate_precondition(A, T0,T1),
translate_precondition(B, T1,T).
translate_precondition(A, (A, T),T).
HTH,
Jens.
--
mailto:jjk@acm.org As the air to a bird, or the sea to a fish,
http://www.bawue.de/~jjk/ so is contempt to the contemptible. [Blake]
|
|
|
|
|