正确使用findall / 3,尤其是第一个模板参数

时间:2011-03-14 23:25:50

标签: prolog prolog-findall

我知道在prolog中有一个内置函数findall / 3, 并且我试图找到总小时数(Thrs)并将它们存储在列表中,然后对列表求和。但它对我不起作用。这是我的代码:

totalLecHrs(LN,THrs) :-
    lecturer(LN,LId),
    findall(Thrs, lectureSegmentHrs(CC,LId,B,E,THrs),L),
    sumList(L,Thrs).
你可以告诉我它有什么问题吗?非常感谢。

2 个答案:

答案 0 :(得分:3)

您需要在 findall / 3 子目标中为小时使用“虚拟”变量。您所写的内容使用THrs作为 sumList / 2 的返回值,并使用 findall / 3 在L中列出的变量。使用X作为findall的第一个参数,并在相应的子目录 lectureSegmentHrs / 5 中作为最后一个参数。

答案 1 :(得分:1)

看起来问题是你为不同的事情使用了两次相同的变量(Thrs)。但是很难说,因为你在不同的地方也使用了不同的大写字母。更改findall行,以便初始变量在lectureSegmentHrs调用中具有相同的大小写。然后完全使用另一个变量来获得最终输出值(即sumList和整个谓词的返回槽中出现的值)。

您需要使用其他变量,因为Prolog不支持变量重新分配。在逻辑语言中,重新分配变量的概念本质上是不可能的。像下面这样的东西看似合情合理......

...
X = 10,
X = 11,
...

但你必须记住,Prolog中的,是连词运算符。你有效地告诉Prolog找到你的问题的解决方案,其中X在同时<10> 11 。所以它显然会告诉你,这是不可能完成的。

相反,您必须在进行时编制新的变量名称。有时这确实有点烦人,但它只是与逻辑语言的领域相关。