2014-04-04 31 views
1

我今天在Prolog上有一門考試,現在正在使用舊的問題修改它。prolog predicates - swap

答案c是不正確的答案?任何人都可以向我解釋這個嗎?這將是非常有益的。謝謝你,

考慮以下斷言:

swap([], []). 
swap([X1, X2 | L], [X2, X1 | S]) :- swap(L, S). 

下列哪個查詢和答案對不正確:

(a) ?- swap([a,b,c,d], S). 
S = [b, a, d, c]. 

(b) ?- swap([a,b,d], H). 
false. 

(c) ?- swap([a,a,b,b], S). 
S = [b, b, a, a]. 

(d) ?- swap([], S). 
S = []. 
+0

C將是不正確的。仔細看看謂詞並假裝你是序言翻譯。然後將你的輸入與roght子句相匹配,看看會發生什麼。 – lurker

回答

0

(C)確實是不正確的答案。 (c)項具有以下查詢:

swap([a,a,b,b], S). 

如果手動運行此查詢,這顯然不符合條款swap([], []).然後,它不匹配第二條:swap([X1,X2|L], [X2,X1|S]) :-...

swap([a, a, b, b], S). 
swap([X1, X2 | L], [X2, X1 | S]) :- swap(L, S). 
==> X1 = a, X2 = a, L = [b, b] 
==> swap([a, a| [b,b]], [a, a | S]) :- swap([b, b], S). 

的Prolog可以與給定的名單,[a,a,b,b]實例化的第一個參數[X1,X2|L]。那麼,那麼意味着X1 = a,X2 = a,以及列表的其餘部分L = [b,b]。從這些信息中,您知道列表[X2,X1|S][a,a|S],但(c)顯示的答案是[b,b,a,a]。你甚至不需要找出什麼S,因爲你知道alr​​ady [a,a|S]不會匹配[b,b,a,a]