0

我们有事实

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 下研究了多少科目的查询是什么。

4

3 回答 3

1

已标记 SWI-Prolog 您的问题,请查看库(聚合):

?- aggregate(count, Module, Branch^studies(Branch, Module), N).
N = 3.

library(aggregate) 很强大,学习它真的很有意义......

于 2013-11-01T21:01:37.543 回答
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)所有答案的列表。因此,例如,您可以通过在 (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节中找到。

于 2013-11-01T17:53:32.247 回答
1

我不会告诉你解决方案,但这可以帮助你自己找出答案:

如果你想计算模块,那么你需要一个模块列表并计算它的长度。

永远记住这句话:

列表要么是一个空列表,要么是一个元素和一个列表。

使用它,您可以递归地构建模块列表。

确保没有元素在列表中出现两次。

于 2013-11-01T11:06:13.103 回答