2011-04-17 31 views
5

我與這兩條線的麻煩:Prolog - 在特殊情況下消除重複答案的更好方法?

list_swizzle(L, [], L). 
list_swizzle([], L, L). 

的問題是,如果雙方的前兩個參數是空單,前兩個語句都將被使用,返回相同的答案。但是,如果我把一個切入一個,它會破壞回溯。我最終放在他們上面的這一行:

list_swizzle([], [], []):- !. 

它的工作原理。但我想知道是否有更優雅的解決方案。

+0

這切又是一個紅色的成功運行此切。你可以看到:'list_swizzle(Xs,Ys,Zs),Xs = [_]'失敗並且上面的剪切。它通過@daf給出的答案成功。 – false 2012-10-07 17:59:25

回答

4

這裏是我的版本:

list_swizzle([H|T], [], [H|T]). 
list_swizzle([], L, L). 

我在[]不統一對[H | T]計數的第一個事實。換句話說,[]沒有T,因爲它是空列表,所以第一個事實與第一個arg中的[]不匹配。

我對SWI-Prolog的(多線程,32位版本5.8.2)

$ cat tt.pl 

s([H|T], [], [H|T]). 
s([], L, L). 

....

For help, use ?- help(Topic). or ?- apropos(Word). 

?- [tt]. 
% tt compiled 0.00 sec, 920 bytes 
true. 

?- s(L,[],[]). 
L = []. 

?- 
% halt 
相關問題