2011-10-19 62 views

回答

5

序言列表只是可以直接使用相等運算符「比較」的術語。 不等於可能意味着不可統一不等同

不unifiable

?- [1, 2] \= [1, 2].  ===> false 
?- [1, 2] \= [1, X].  ===> false 
?- [1, 2] \= [1, 3].  ===> true 

不相同

?- [1, 2] \== [1, 2].  ===> false 
?- [1, 2] \== [1, X].  ===> true 
?- [1, 2] \== [1, 3].  ===> true 
+0

'dif/2'是一個聲音選項:'? - dif([1,2],[1,X])。 ===> dif(X,2).' – false

0

這就是我想出了:

not-equal([],[H|_]). 
not-equal([H|_],[]). 
not-equal([H|T1],[H|T2]) :- 
    not-equal(T1,T2). 

not-equal([H1|T1],[H2|T2]) :- 
    not(var(H1)), 
    not(var(H2)), 
    H1 =\= H2. 

在謂詞你有一個小寫的「一」,這是一個原子,而不是一個變量。另外,當你打電話給not-equal(a,T)時,你正在使用列表之外,所以它不會工作。

我還會考慮將謂詞的名稱更改爲not-unifiable,因爲該列表可能包含可能使它們相等或不相等的變量,具體取決於這些變量將來的統一方式。

還有一些情況不適用於我的上述代碼。

作爲替代我會考慮使用?=操盤手,就像這樣:

not-equal([H1|T1],[H2|T2]) :- not([H1|T1]?=[H2|T2]). 

讓我知道,如果這些幫助。

+0

請注意'not-equal(X,Y)'是主函子'( - )/ 2'的一個術語。改用'not_equal(X,Y)'。至於'(?=)/ 2',這是成功的理想*和*不可通用的術語。所以你失敗了'not_equal([X],[Y])' – false

相關問題