Эквивалентность оператора дизъюнкции и определение с несколькими правилами
Я просто наткнулся на определение ;/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 .
И да, вы смешиваете это ;
с чем-то связанным, но совершенно другим _ -> _ ; _
,