我正在尝试实现没有回溯行为的逻辑表达式评估。 经过一些实验,我得到了它的工作,这里是:
:- op(80, xfy, and).
:- op(80, xfy, or).
%check/evaluate logical expressions
check(true) :- !.
check(Cond and Conds) :- !, (check(Cond) , check(Conds)).
check(Cond or Conds) :- !, (check(Cond) ; check(Conds)), !. %% <- weird
check(Cond) :- !, call(Cond).
?- check(true and true).
true.
?- check(true and false).
false.
?- check(true or false).
true.
?- check(true or (false and true)).
true.
?- check((true or false) and (false and true)).
false.
?- X = 1 , Y = 2 , check((X = 1) and (Y > 1)).
X = 1,
Y = 2.
所以代码有效。 我的问题是为什么它有效,特别是需要两次削减!在OR表达式中。
这看起来像是正确的Prolog实现吗?
你自己怎么做?