假设我在 Prolog 中有以下规则(我正在使用 SWI-Prolog):
rule :-
subrule_1 ;
subrule_2 ;
subrule_3 ;
...
subrule_n.
因此,只要其中一个子规则成功,“规则”就会成功。我知道一旦一个子规则成功,其他子规则就不会被执行。我想要做的是添加功能以便执行所有子规则,并创建成功的子规则列表。但是当没有成功时,“规则”仍然应该失败。到目前为止,这就是我能想到的:
...
rule(Successes), % This is the external call
...
规则是:
rule(Succeed_List) :-
L1 = [],
((subrule_1 -> append(L1,['subrule_1'],L2) ; L2 = L1) ,
(subrule_2 -> append(L2,['subrule_2'],L3) ; L3 = L2) ,
...
(subrule_n -> append(Ln,['subrule_n'],Succeed_List) ; Succeed_List = Ln)),
\+ length(Succeed_List,0).
当然必须有更好的方法来做到这一点!我正在考虑使用“bagof”,但我不确定它会如何工作。我的问题是,实施上述规则的更好方法是什么?
对于那些想知道“这些子规则到底可能是什么”的人,我在这里省略了很多关于我想要做什么的细节。如果您想知道,每个子规则都有一个参数,每个子规则都相同。这是一个元数为 8 的术语,但每个参数都是一个已经绑定的原子。子规则检查术语的论点。