Пролог: оценка логического выражения без возврата с помощью AND/OR op/2?
Я пытаюсь реализовать оценку логических выражений без поведения возврата. После некоторых экспериментов я получил это работает, здесь идет:
:- 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.
Так что код работает. Мой вопрос, почему это работает, особенно необходимость двух сокращений! в выражении ИЛИ.
Это похоже на правильную реализацию Пролога?
Как бы вы сделали это сами?