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

Prolog 正确使用findall/3,尤其是第一个模板参数,prolog,prolog-findall,Prolog,Prolog Findall,我知道prolog中有一个内置函数findall/3, 我试图找出总小时数(THR)并将其存储在一个列表中,然后对列表进行汇总。但这对我不起作用。这是我的密码: totalLecHrs(LN,THrs) :- lecturer(LN,LId), findall(Thrs, lectureSegmentHrs(CC,LId,B,E,THrs),L), sumList(L,Thrs). 你能告诉我有什么问题吗?非常感谢。您需要在findall/3子目标中使用一个“虚拟”变量

我知道prolog中有一个内置函数findall/3, 我试图找出总小时数(THR)并将其存储在一个列表中,然后对列表进行汇总。但这对我不起作用。这是我的密码:

totalLecHrs(LN,THrs) :-
    lecturer(LN,LId),
    findall(Thrs, lectureSegmentHrs(CC,LId,B,E,THrs),L),
    sumList(L,Thrs).

你能告诉我有什么问题吗?非常感谢。

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

问题似乎在于,对于不同的事情,您两次使用相同的变量(
Thrs
)。然而,这很难说,因为你在不同的地方也使用了不同的资本。更改
findall
行,使初始变量在
讲师segmenthrs
调用中具有相同的资本化。然后完全使用不同的变量来获得最终输出值(即出现在
sumList
和整个谓词的返回槽中的变量)

您需要使用不同的变量,因为Prolog不支持变量重新分配。在逻辑语言中,重新分配变量的概念本质上是不可能的。像下面这样的事情似乎是明智的

...
X = 10,
X = 11,
...
但是您必须记住,Prolog中的
是连词操作符。实际上,您是在告诉Prolog找到问题的解决方案,其中X同时为10和11。很明显,它会告诉你这是不可能的

取而代之的是,您必须在进行过程中创建新的变量名。有时这确实有点烦人,但它只是符合逻辑语言的领域