问题描述
我想计算某个规则被声明的次数。
例如“my_rule/3”:
my_rule(1,A,B) :- A is 1,B is 2.
my_rule(2,B) :- A is 2,B is 3.
my_rule(3,B) :- A is 3,B is 4.
my_rule(4,B) :- A is 21,B is 1.
?- count_myrule(C).
C = 4.
请注意,我想计算规则,而不是事实。在前面的示例中,规则的语义无关紧要,我只是想了解是否可以计算我声明某个规则的次数。 有没有办法实现这一目标?提前致谢。
解决方法
您可以使用 clause/2
获取谓词的所有子句的定义。第一个参数是您感兴趣的子句标题,第二个参数是正文。如果子句是一个事实(或者如果它被写成一个“规则”,只有 true
作为它的主体),则主体将是 true
。
例如,给定:
foo(a,b).
foo(b,c).
foo(C,D) :-
foo(D,C).
我们得到:
?- clause(foo(X,Y),Body).
X = a,Y = b,Body = true ;
X = b,Y = c,Body = true ;
Body = foo(Y,X).
前两个答案针对两个事实(Body
是 true
),第三个答案针对规则。所以只获取规则:
?- clause(foo(X,Body),Body \= true.
Body = foo(Y,X).
要计算规则的数量,您可以使用任何计算此查询的解决方案数量的方法。例如,使用 findall/3
收集解决方案列表并取其长度,或使用 SWI-Prolog 的 aggregate/3
。
编辑:请注意 Paulo Moura 关于可移植到其他 Prolog 系统的评论。