我在这两条线上遇到了麻烦:
list_swizzle(L, [], L).
list_swizzle([], L, L).
问题是如果前两个参数都是空列表,那么前两个语句都将被使用,返回相同的答案。但是,如果我将其中一个切入,它会破坏回溯。我最终在它们上面加上了这一行:
list_swizzle([], [], []):- !.
它有效。但我想知道是否有更优雅的解决方案。
我在这两条线上遇到了麻烦:
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