1

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

4

1 回答 1

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).
于 2013-06-17T19:27:40.730 回答