我知道 prolog 中有一个内置函数 findall/3,我试图找到总小时数(Thrs)并将它们存储在一个列表中,然后对列表求和。但这对我不起作用。这是我的代码:
totalLecHrs(LN,THrs) :-
lecturer(LN,LId),
findall(Thrs, lectureSegmentHrs(CC,LId,B,E,THrs),L),
sumList(L,Thrs).
你能告诉我有什么问题吗?多谢。
我知道 prolog 中有一个内置函数 findall/3,我试图找到总小时数(Thrs)并将它们存储在一个列表中,然后对列表求和。但这对我不起作用。这是我的代码:
totalLecHrs(LN,THrs) :-
lecturer(LN,LId),
findall(Thrs, lectureSegmentHrs(CC,LId,B,E,THrs),L),
sumList(L,Thrs).
你能告诉我有什么问题吗?多谢。
您需要在findall/3子目标中为 Hours 使用“虚拟”变量。您编写的内容使用 THrs 作为sumList/2的返回值和要在 L 中列出的变量findall/3。使用 X 作为 findall 的第一个参数,并在相应的子目标LectureSegmentHrs/5作为最后一个参数。
看起来问题在于您将相同的变量 ( Thrs
) 用于不同的事物两次。但是很难说,因为您还在不同的地方使用了不同的大小写。更改findall
行,使初始变量在lectureSegmentHrs
调用中具有相同的大小写。然后完全使用不同的变量来获得最终的输出值(即出现在sumList
整个谓词的返回槽中的那个)。
您需要使用不同的变量,因为 Prolog 不支持变量重新分配。在逻辑语言中,重新分配变量的概念本质上是不可能的。像下面这样的东西可能看起来很明智......
...
X = 10,
X = 11,
...
但是你必须记住,,
在 Prolog 中是合取运算符。您实际上是在告诉 Prolog 找到 X 同时为 10 和 11 的问题的解决方案。所以它显然会告诉你这是不可能的。
取而代之的是,您必须在进行时编造新的变量名称。有时这确实有点烦人,但这只是逻辑语言的范畴。