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

时间:2011-04-17 01:19:42

标签: prolog prolog-cut

我在使用这两行时遇到了麻烦:

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

问题在于,如果前两个参数都是空列表,则前两个语句都将被使用,返回相同的答案。但是,如果我把一个切入一个,它会破坏回溯。我最终把它放在它们上面:

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

它有效。但我想知道是否有更优雅的解决方案。

1 个答案:

答案 0 :(得分: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