我知道在prolog中有一个内置函数findall / 3, 并且我试图找到总小时数(Thrs)并将它们存储在列表中,然后对列表求和。但它对我不起作用。这是我的代码:
totalLecHrs(LN,THrs) :-
lecturer(LN,LId),
findall(Thrs, lectureSegmentHrs(CC,LId,B,E,THrs),L),
sumList(L,Thrs).
你可以告诉我它有什么问题吗?非常感谢。
答案 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 。所以它显然会告诉你,这是不可能完成的。
相反,您必须在进行时编制新的变量名称。有时这确实有点烦人,但它只是与逻辑语言的领域相关。