2011-05-31 69 views
1

我正在寫一個名爲subseq的函數,它檢查一個列表是否是另一個列表的子序列。prolog實例化錯誤= =運算符

subseq([],[]). 
subseq([],[Y|Ys]). 
subseq([X|Xs],[Y|Ys]) :- X=:=Y, subseq(Xs,Ys). 
subseq([X|Xs],[Y|Ys]) :- X=\=Y, subseq([X|Xs],Ys). 

當我嘗試SUBSEQ(X,[1,2])我得到:

X = [] ? ; 
uncaught exception: error(instantiation_error,(=:=)/2) 

這究竟是爲什麼?我的猜測是[=]正在通過=:=進行操作,但是如何檢查/防止此錯誤?

回答

3

您在此處的錯誤上下文中使用=:==\=。當你有兩個表達式並且想要評估和比較它們時,應該使用這兩個運算符。在您的測試中,因爲X事先不知道,所以Prolog無法評估X並與Y比較。有關=:==\=的更多信息可以在這裏找到:Prolog Operator =:=

在你的代碼只需要統一的原子那麼一個可能的修復可能是:

subseq([],[]). 
subseq([],[_|_]). 
subseq([X|Xs],[Y|Ys]) :- X=Y, subseq(Xs,Ys). 
subseq([X|Xs],[Y|Ys]) :- X\=Y, subseq([X|Xs],Ys). 
+1

大部分Prolog系統提供DIF/2,你可以代替(\ =)/ 2使用。不過,我不會稱這個謂詞爲subq/2。 – false 2011-06-01 22:48:22