Prolog统计事实上的唯一标识符

时间:2013-11-01 07:44:08

标签: prolog swi-prolog

我们有事实

studies(cse, plc).
studies(cse, da). 
studies(it, se). 
studies(it, plc).  

其中研究(x,y)表示分支x研究模块y。 现在我想定义规则来计算所有模块的数量。就像这里一样,它将是(plc,da,se).PLZ HELP。

在CSE下查找有多少科目进行的查询是什么。

3 个答案:

答案 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.

库(聚合)很强大,了解它可能真的很有价值......