到目前为止,我正在考虑通过执行以下操作来减少:
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)我可以检查是否相等,但如何“停止”搜索并强制输出?
答案 0 :(得分:1)
[H1|T1]
将整个列表作为参数传递。答案 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)
您的问题“如何让它停止?”实际上暗示了你的谓词缺失部分。您目前有一个没有基本情况的递归谓词 - 递归无法停止。好吧,我想在这种情况下,它会到达其中一个列表的末尾,但由于这将是空列表,因此在与[H | T]一词统一时将失败,因为没有头项。< / p>
当编写正在寻找列表的特定元素的递归谓词时,通常使基数包含定义解决方案的约束。您可以在Jerome的解决方案中看到这一点。这会导致谓词在找到解决方案后成功,并且之后不会继续处理列表。然而,如果你告诉它回溯并寻找更多解决方案,它将在此之后继续。如果您不关心这些进一步的解决方案,那么您可以使用剪切来丢弃它们。