我想構建一個Prolog程序來確定兩個列表(作爲參數提供)是否不相等。Prolog,確定兩個列表是否不相等的程序
這是我到目前爲止所做的。
not-equal([],[a|_]).
not-equal([a|_],[H|T]):-not-equal(a,T).
我想構建一個Prolog程序來確定兩個列表(作爲參數提供)是否不相等。Prolog,確定兩個列表是否不相等的程序
這是我到目前爲止所做的。
not-equal([],[a|_]).
not-equal([a|_],[H|T]):-not-equal(a,T).
序言列表只是可以直接使用相等運算符「比較」的術語。 不等於可能意味着不可統一或不等同。
不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
'dif/2'是一個聲音選項:'? - dif([1,2],[1,X])。 ===> dif(X,2).' – false
這就是我想出了:
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]).
讓我知道,如果這些幫助。
請注意'not-equal(X,Y)'是主函子'( - )/ 2'的一個術語。改用'not_equal(X,Y)'。至於'(?=)/ 2',這是成功的理想*和*不可通用的術語。所以你失敗了'not_equal([X],[Y])' – false
定義 「等於」。 Unifiable? – Kaarel