计算一条规则被声明的次数 - SWI Prolog

Count the number of times a rule is declared - SWIProlog

我想统计某个规则被声明的次数。

例如“my_rule/3”:

        my_rule(1,A,B) :- A is 1, B is 2.
        my_rule(2,A,B) :- A is 2, B is 3.
        my_rule(3,A,B) :- A is 3, B is 4.
        my_rule(4,A,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).

前两个答案针对两个事实(Bodytrue),第三个答案针对规则。所以只获取规则:

?- clause(foo(X, Y), Body), Body \= true.
Body = foo(Y, X).

要计算规则数,您可以使用任何计算此查询的解决方案数的方法。例如,使用 findall/3 收集解决方案列表并取其长度,或使用 SWI-Prolog 的 aggregate/3.

编辑: 请注意 Paulo Moura 关于对其他 Prolog 系统的可移植性的评论。