假设我在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”,但我不确定这是如何工作的。我的问题是,实施上述规则的更好方法是什么?
对于那些想知道“这些子规则可能是什么”的人来说,我在这里省略了很多细节。如果你想知道,每个子规则都有一个参数,每个参数都相同。它是一个带有arity 8的术语,但每个参数都是一个已经绑定的原子。子规则检查该术语的论点。
答案 0 :(得分:1)
我认为bagof / 3可以完成你的任务:
rule(Succeed_List) :-
bagof(P, (member(P, [subrule_1, subrule_2, .., subrule_n]), P), Succeed_List).
你可以使用仿函数从P中删除大参数:
rule(Succeed_List) :-
bagof(F, (member(P, [subrule_1, subrule_2, .., subrule_n]), P, functor(P, F,_)), Succeed_List).