2011-04-17 91 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 
相关问题