Не означает ли это, что / 2 ведет себя точно так же, как если бы мы написали наш собственный предикат помощника, состоящий из двух правил?
Нет.Преобразование термин в тело имеет значение.
Но сначала его (;)/2
, который определен в и 7.8.6 (дизъюнкция) и 7.8.8 (if-then-else)) - как предлагает самое первое предложение в 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 ) )
будет выполнено, а остальное пропущено.
Дальнейшие различия из-запреобразование терминов в тело для порезов и ошибок из-за уродливых тел.