配对两个列表

时间:2009-12-14 02:20:10

标签: prolog

嘿伙计们,我希望你能帮助我一些简单的序言。基本上,我正在尝试编写一个函数,将输入作为两个列表和一个整数。从那里,函数将尝试在第一个列表中找到x,在第二个列表中找到y,使得x + y等于输入整数。

到目前为止,我正在考虑通过执行以下操作来减少:

sum([H1|T1], [H2|T2], Value) :-
    NewVal is H1+H2
    % Check for equality?
    sum(List1, T2, Value)
    sum(T1, List2, Value).

所以,关于这种方法的一些问题。

1)在我将其作为H1 | T1传递后,如何引用“整个”列表?在示例中,我只是将它们命名为List1和List2以便于阅读。

2)我可以检查是否相等,但如何“停止”搜索并强制输出?

3 个答案:

答案 0 :(得分:1)

  1. IIRC,我认为您应该可以使用[H1|T1]将整个列表作为参数传递。
  2. 您很可能希望使用Prolog cut停止搜索解决方案。

答案 1 :(得分:1)

你需要一个分离,而不是一个结合:因为h1 + h2没问题,或者有一个没有h1的解决方案,或者有一个没有h2的解决方案。

prolog中有两种语法用于析取。您可以使用分号:

sum([H1|T1], [H2|T2], Value) :- Value is H1+H2 ; sum([H1|T1], T2, Value) ; sum(T1, [H2|T2], Value).

或者你可以使用单独的条款:

sum([H1|_], [H2|_], Value) :- Value is H1+H2.
sum([H1|T1], [_|T2], Value) :- sum([H1|T1], T2, Value).
sum([_|T1], [H2|T2], Value) :- sum(T1, [H2|T2], Value).

答案 2 :(得分:1)

1)Kaleb是对的,为了做到这一点,只需将列表重建为尾部的头部缺点 2)杰罗姆是对的,但这是另一种方式......

您的问题“如何让它停止?”实际上暗示了你的谓词缺失部分。您目前有一个没有基本情况的递归谓词 - 递归无法停止。好吧,我想在这种情况下,它会到达其中一个列表的末尾,但由于这将是空列表,因此在与[H | T]一词统一时将失败,因为没有头项。< / p>

当编写正在寻找列表的特定元素的递归谓词时,通常使基数包含定义解决方案的约束。您可以在Jerome的解决方案中看到这一点。这会导致谓词在找到解决方案后成功,并且之后不会继续处理列表。然而,如果你告诉它回溯并寻找更多解决方案,它将在此之后继续。如果您不关心这些进一步的解决方案,那么您可以使用剪切来丢弃它们。