我们有事实
studies(cse, plc).
studies(cse, da).
studies(it, se).
studies(it, plc).
其中研究(x,y)表示分支x研究模块y。 现在我想定义规则来计算所有模块的数量。就像这里一样,它将是(plc,da,se).PLZ HELP。
在CSE下查找有多少科目进行的查询是什么。
答案 0 :(得分:1)
我不会告诉你解决方案,但这可以帮助你自己找到它:
如果你想计算模块,那么你需要一个模块列表并花费它的长度。
永远记住这句话:
列表是空列表或元素和列表。
使用它可以递归地构建模块列表。
确保列表中没有元素两次。
答案 1 :(得分:1)
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)a list所有的答案。例如,您可以使用(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 of the manual部分。
答案 2 :(得分:0)
已将SWI-Prolog标记为您的问题,请查看图书馆(aggregate):
?- aggregate(count, Module, Branch^studies(Branch, Module), N).
N = 3.
库(聚合)很强大,了解它可能真的很有价值......