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 の項ですが、すべての引数は既にバインドされたアトムです。サブルールは、用語の引数を調べます。