Prolog:后续子规则列表

时间:2013-06-17 19:09:25

标签: prolog

假设我在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的术语,但每个参数都是一个已经绑定的原子。子规则检查该术语的论点。

1 个答案:

答案 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).