【发布时间】:2017-12-12 21:34:48
【问题描述】:
所以我对 prolog 很陌生,当整数列表 D 是列表 A 的前缀和列表时,我必须编写一个可满足的谓词。
sums(A, D)
例如,
sums([4,11,1,-3,8], [4,15,16,13,21]) is satisfiable
我已经用十几种不同的方式编写了这个谓词,但都无济于事。这是我目前写的。
sums([], []).
sums([A], [A]).
sums([A|[B|C]], [A|[E|F]]) :- TOTAL is A + B, E = TOTAL, sums([C], [F]).
这有点工作,因为它将检查每个列表的第一个值是否相等,并检查列表中的第二个元素是否正确,因为它应该是 15。我理解它为什么以这种方式不正确地工作,但我无法想出如何以不同的方式以正确的方式编写它。
我已将代码更改为,
sumrunner(L, S) :- sumrunner(L, S, 0).
sumrunner([], [], _).
sumrunner([A], [A], _).
sumrunner([A|B], [C|D], TOTAL) :- TOTAL is TOTAL + A, TOTAL = C,sumrunner(B, D, TOTAL).
但是,现在它只对所有情况都说 false,除非两个列表为空,并且两个列表都包含一个元素并且它们彼此相等。
【问题讨论】:
-
你的意思是 predicate 不是 functor (我编辑了你的问题)。如果您编写了术语
foo(a, b),那么foo是一个称为函子 的术语,具有两个参数a和b。 functor 只是指foo部分,它必须是一个atom。但它作为 functor 没有其他指定用途。 谓词使用一个函子作为它的head来实现一个rule。 functor 也可用于声明事实或其他结构数据。网上有几个不同的Prolog glossaries。 -
@lurker。您链接到的词汇表质量有些低。考虑函子的条目:“函子是目标或查询的一部分,位于 '(' 之前。函子必须遵守与原子完全相同的命名规则。” OTOH 查看this part of the SICStus Prolog documentation ... 完全不同,你不同意吗?
-
@repeat 是的,事后看来我同意并且对此并不完全满意,但必须从某个地方开始。老实说,我找不到两个匹配的 Prolog 词汇表。 “官方 Prolog 词汇表”没有确定的位置。信不信由你,我发现了一些保真度甚至低于那个的。
-
@lurker。无论如何thx 4让球滚动! “权威”词汇表 (ISO/IEC 13211-1:1995) 不是免费提供的;(但好消息是:SICStus Prolog 4.3.5 manual (PDF, 1458 pages) 无需注册即可免费下载。即使您不注册也可以查看使用 SICStus Prolog——但是;)太好了!
-
非常感谢@repeat!我将下载免费手册。ISO 文档有点贵。