Пролог: оценка логического выражения без возврата с помощью 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.

Так что код работает. Мой вопрос, почему это работает, особенно необходимость двух сокращений! в выражении ИЛИ.

Это похоже на правильную реализацию Пролога?

Как бы вы сделали это сами?

0 ответов

Другие вопросы по тегам