【问题标题】:Prolog -- better way to eliminate duplicate answer in special case?Prolog - 在特殊情况下消除重复答案的更好方法?
【发布时间】:2011-04-17 01:19:41
【问题描述】:

这两行我遇到了问题:

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

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

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

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

【问题讨论】:

  • 这个切口又是一个红色切口。你可以看到这个:list_swizzle(Xs,Ys,Zs), Xs = [_],上面的切割失败了。它以@daf 给出的答案成功。

标签: prolog prolog-cut


【解决方案1】:

这是我的版本:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2019-05-29
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多