我们有事实
studies(cse, plc).
studies(cse, da).
studies(it, se).
studies(it, plc).
其中 study(x,y) 表示分支 x 研究模块 y 。现在我想定义规则来计算所有模块的数量。像这里它将是 3.that 是 (plc,da,se).PLZ HELP。
查询 CSE 下研究了多少科目的查询是什么。
我们有事实
studies(cse, plc).
studies(cse, da).
studies(it, se).
studies(it, plc).
其中 study(x,y) 表示分支 x 研究模块 y 。现在我想定义规则来计算所有模块的数量。像这里它将是 3.that 是 (plc,da,se).PLZ HELP。
查询 CSE 下研究了多少科目的查询是什么。
已标记 SWI-Prolog 您的问题,请查看库(聚合):
?- aggregate(count, Module, Branch^studies(Branch, Module), N).
N = 3.
library(aggregate) 很强大,学习它真的很有意义......
number_of_modules(N) :-
findall(M, studies(_,M), Ms),
sort(Ms, SortedMs),
length(SortedMs, N).
?- number_of_modules(N).
N = 3.
sort/2
删除重复元素。
的参数findall/3
从左到右是(1)要收集的答案的模板,(2)得出答案的目标,(3)所有答案的列表。因此,例如,您可以通过在 (1) 中使用不同的模板来标记每个模块:
number_of_modules(N, SortedMs) :-
findall(module(M), studies(_,M), Ms),
sort(Ms, SortedMs),
length(SortedMs, N).
?- number_of_modules(N, Ms).
N = 3,
Ms = [module(da), module(plc), module(se)].
有关此谓词和相关谓词的文档可以在手册的第 4.3节中找到。
我不会告诉你解决方案,但这可以帮助你自己找出答案:
如果你想计算模块,那么你需要一个模块列表并计算它的长度。
永远记住这句话:
列表要么是一个空列表,要么是一个元素和一个列表。
使用它,您可以递归地构建模块列表。
确保没有元素在列表中出现两次。