Разница между X\=Y и dif(X,Y)

Какая разница между этим:

X \= Y

и этот кусок кода:

dif(X, Y)

Я думал, что они должны вести себя так же, но они этого не делают. Вот пример:

n_puta(L, N, X) :- nputa(L, N, 0, X).
nputa([], N, C, _) :- N = C.
nputa([G|R], N, C, X) :- G = X, nputa(R, N, Y, X), C is Y - 1.
nputa([G|R], N, C, X) :- dif(G,X), nputa(R, N, C, X).

И вот несколько звонков:

?- n_puta([a,a,b,b,b], 2, X).
X = a ;
false.

?- n_puta([a,a,b,a,b,b], 3, X).
X = a ;
X = b ;
false.

X должен быть атомом, который встречается ровно N раз в списке L. Если я заменю dif(G, X) с G \= XЯ не получаю ожидаемого результата. Может кто-нибудь сказать мне, в чем разница между этими двумя операторами? Могу ли я использовать что-нибудь еще, кроме dif(G, X)?

Этот пример прекрасно работает в SWI-Prolog, но не работает в Amzi! Пролог.

1 ответ

Решение

dif/2 а также (\=)/2 так же, как их аргументы являются обоснованными. Но только dif/2 это чистое отношение, которое корректно работает и с переменными и может использоваться во всех направлениях. Ваш пример ясно показывает, что вы должны использовать dif/2 в этом случае, потому что вы используете свой предикат не только для тестирования, но и для генерации решений. Наиболее широко используемые системы Prolog обеспечивают dif/2,

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