前言-在特殊情况下消除重复答案的更好方法



我对这两行有问题:

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

问题是,如果前两个参数都是空列表,则将同时使用前两个语句,返回相同的答案。但是,如果我在其中一个上切了,它就破坏了回溯。最后我在它们上面加上了这一行:

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

它起作用了。但我想知道是否有一个更优雅的解决方案。

我的版本:

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

我指望[]在第一个事实中不会统一反对[H|T]。换句话说,[]没有T,因为它是空列表,所以第一个事实与第一个参数中的[]不匹配。

我已经在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

最新更新