Эквивалентность оператора дизъюнкции и определение с несколькими правилами

Я просто наткнулся на определение ;/2 в Руководстве по Прологу SWI, в котором говорится:

The `or' predicate is defined as:

Goal1 ; _Goal2 :- Goal1.
_Goal1 ; Goal2 :- Goal2.

Разве это не значит, что ;/2 ведет себя точно так же, как если бы мы написали наш собственный предикат помощника, состоящий из двух правил? Я запомнил, что ;/2 была нечистой конструкцией (но, возможно, я смешиваю это с if-then-else), но это определение чисто (хотя и мета-логическое).

Семантика ;/2 определены в стандарте ISO в пункте 7.8.6, но это делается с точки зрения манипулирования текущим состоянием, точками выбора и т. д.

Соответствует ли определение в руководстве SWI определению ISO? Если нет, знаете ли вы пример, где они отличаются?

2 ответа

Решение

Не означает ли это, что /2 ведет себя точно так же, как если бы мы написали наш собственный предикат помощника, состоящий из двух правил?

Нет. Преобразование термина в тело имеет значение.

Но сначала его (;)/2 который определен как в 7.8.6 (дизъюнкция), так и в 7.8.8 (если-то-еще) - как предлагает самое первое предложение в 7.8.6. Для круглых скобок вокруг ; см. примечание в 7.1.6.6.

Итак, первый вопрос - как можно решить, какой подпункт применяется в случае, если вы видите ( G_0 ; H_0 ) в вашей программе. Это не зависит от наличия экземпляра при вызове (;)/2 скорее это зависит от того, когда вы преобразуетесь в термины "тело-тело" (7.6.2).

?- G_0 = ( true -> X = si ), ( G_0 ; X = nisi ).
   G_0 =  (true->si=si),
   X = si
;  G_0 =  (true->nisi=si),
   X = nisi.

?- G_0 = ( true -> X = si ), call( ( G_0 ; X = nisi ) ).
   G_0 =  (true->si=si),
   X = si.

В первом запросе преобразование термов в тело заменяет внутри дизъюнкции G_0 от call(G_0) и поэтому

( call( ( true -> X = si ) ) ; X = nisi ) )

будет выполнен.

Во втором запросе есть два преобразования термов в тело: один раз для всего запроса и один раз для явного call/1, но оба оставляют все как есть, и таким образом

call( ( true -> X = si ; X = nisi ) )

будет выполнен, а остальное не учтено.

Дальнейшие различия из-за преобразования тела в тело относятся к порезам и ошибкам из-за уродливых тел.

Насколько я знаю, определяя

p(X) :- G1 ; G2 .

так же, как определение

p(X) :- G1 .
p(X) :- G2 .

И да, вы смешиваете это ; с чем-то связанным, но совершенно другим _ -> _ ; _,

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