创建用于计算模块数量的规则

时间:2013-11-19 22:20:10

标签: prolog

student(ram,cse).
student(kirat,com).
student(ajay,cse).
student(amit,cmt).

studies(cmt,uc).
studies(cmt,pm).
studies(com,pm).
studies(com,aplc).
studies(com,ads).
studies(cse,aplc).
studies(cse,pm).
studies(cse,algorithms).
studies(cmt,pm).

classmate(X,Y):-student(X,Y).

我需要为“计算所有模块中的模块数量,即cse,cmt和com”创建规则。

当我只提供csecmtcom时,它会显示有多少个模块。这些模块存储在给定的研究事实中,我将如何制定规则。

2 个答案:

答案 0 :(得分:2)

Shevliaskovic和mbratch指出的解决方案中有两个问题。在第一种情况下,aggregate_all /3不是标准谓词,使得该解决方案不那么便携。但是由于匿名变量而使用setof/3显示的方式不会给出预期的结果:

?- setof(M, studies(M, _), ListOfModules), length(ListOfModules, Num).
ListOfModules = [com],
Num = 1 ;
ListOfModules = [cse],
Num = 1 ;
ListOfModules = [com, cse],
Num = 2 ;
ListOfModules = [cmt, com, cse],
Num = 3 ;
ListOfModules = [cmt],
Num = 1.

为了使问题更清楚,我们可以用命名变量替换匿名变量:

?- setof(M, studies(M, A), ListOfModules), length(ListOfModules, Num).
A = ads,
ListOfModules = [com],
Num = 1 ;
A = algorithms,
ListOfModules = [cse],
Num = 1 ;
A = aplc,
ListOfModules = [com, cse],
Num = 2 ;
A = pm,
ListOfModules = [cmt, com, cse],
Num = 3 ;
A = uc,
ListOfModules = [cmt],
Num = 1.

更正此问题很容易。解决方案是明确限定studies/2的第二个参数,以便我们不会得到第二个参数的每个值的解决方案:

?- setof(M, A^studies(M, A), ListOfModules), length(ListOfModules, Num).
ListOfModules = [cmt, com, cse],
Num = 3.

答案 1 :(得分:1)

aggregate_all(count, studies(cse,_), Count).

4 ?- aggregate_all(count, studies(cse,_), Count).
Count = 3.

与cmt,com。

的作用相同

正如@mbratch所说,这不会显示唯一模块的数量,而是显示它们的总数。