2013-05-15 6 views
3

В чем разница между этим:разница между Х = Y и диф (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! Пролог.

+3

У меня был аналогичный вопрос, который получил много полезных ответов: http://stackoverflow.com/questions/13757261/using-or-dif?rq=1 –

ответ

3

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

Смежные вопросы