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”创建规则。
当我只提供cse
,cmt
或com
时,它会显示有多少个模块。这些模块存储在给定的研究事实中,我将如何制定规则。
答案 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所说,这不会显示唯一模块的数量,而是显示它们的总数。