1

Prolog に次のルールがあるとします (SWI-Prolog を使用しています)。

rule :-
    subrule_1 ;
    subrule_2 ;
    subrule_3 ;

    ...

    subrule_n.

したがって、「ルール」は、サブルールの 1 つが成功するたびに成功します。1 つのサブルールが成功するとすぐに、他のサブルールは実行されないことを知っています。私がやりたいことは、すべてのサブルールが実行されるように機能を追加し、成功したサブルールのリストを作成することです。しかし、「ルール」は、どれも成功しない場合でも失敗するはずです。これまでのところ、これは私が考えることができるすべてです:

...
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」を使用することを考えていましたが、それがどのように機能するかわかりません。私の質問は、上記のルールを実装するより良い方法は何ですか?

「これらのサブルールはいったい何なのか」と疑問に思っている人のために、私がやろうとしていることに関して、ここでは多くの詳細を省略しています。知りたい場合は、各サブルールに 1 つの引数があり、それぞれに同じです。これはアリティ 8 の項ですが、すべての引数は既にバインドされたアトムです。サブルールは、用語の引数を調べます。

4

1 に答える 1