计算一条规则被声明的次数 - 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).
前两个答案针对两个事实(Body
是true
),第三个答案针对规则。所以只获取规则:
?- clause(foo(X, Y), Body), Body \= true.
Body = foo(Y, X).
要计算规则数,您可以使用任何计算此查询的解决方案数的方法。例如,使用 findall/3
收集解决方案列表并取其长度,或使用 SWI-Prolog 的 aggregate/3
.
编辑: 请注意 Paulo Moura 关于对其他 Prolog 系统的可移植性的评论。
我想统计某个规则被声明的次数。
例如“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).
前两个答案针对两个事实(Body
是true
),第三个答案针对规则。所以只获取规则:
?- clause(foo(X, Y), Body), Body \= true.
Body = foo(Y, X).
要计算规则数,您可以使用任何计算此查询的解决方案数的方法。例如,使用 findall/3
收集解决方案列表并取其长度,或使用 SWI-Prolog 的 aggregate/3
.
编辑: 请注意 Paulo Moura 关于对其他 Prolog 系统的可移植性的评论。