微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算规则声明的次数 - SWIProlog

如何解决计算规则声明的次数 - SWIProlog

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

例如“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).

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。