私はswiプロローグを使用しています。アリティ 4 のファクトで構成される、このようなファクト ベースがあります。
attribute(a1,a2,a3,a4).
data(yes,no,no,no).
data(yes,no,yes,no).
data(yes,yes,yes,no).
data(yes,yes,yes,yes).
data(no,yes,yes,yes).
そして、私のコードは、 pbayes(yes,no,no,no,Result); を呼び出したときに Result の確率を計算します。
p(ColumnName,ColumnValue,Result):-
(
(ColumnName==a1->findall(ColumnValue,data(ColumnValue,_,_,_),Liste));
(ColumnName==a2->findall(ColumnValue,data(_,ColumnValue,_,_),Liste));
(ColumnName==a3->findall(ColumnValue,data(_,_,ColumnValue,_),Liste));
(ColumnName==b->findall(ColumnValue,data(_,_,_,ColumnValue),Liste))
),
length(Liste,Sayac),
findall(_,data(_,_,_,_),TumListe),
length(TumListe,TumSayac),
Result is Sayac/TumSayac.
pcond(ColumnName,ColumnValue,BValue,Result):-
(
s(ColumnName==a1->findall(ColumnValue,data(ColumnValue,_,_,BValue),Liste));
(ColumnName==a2->findall(ColumnValue,data(_,ColumnValue,_,BValue),Liste));
(ColumnName==a3->findall(ColumnValue,data(_,_,ColumnValue,BValue),Liste))
),
length(Liste,Sayac),
findall(BValue,data(_,_,_,BValue),BListe),
length(BListe,BSayac),
Result is Sayac/BSayac.
pbayes(B,A1,A2,A3,Result):-
pcond(a1,A1,B,ResultCondA1),
pcond(a2,A2,B,ResultCondA2),
pcond(a3,A3,B,ResultCondA3),
p(b,B,ResultB),
(Mult1=0->Result is 0,!;true),
p(a1,A1,ResultA1),p(a2,A2,ResultA2),p(a3,A3,ResultA3),
Mult2 is ResultA1 * Result2 * ResultA3,
(Mult=0->Result is 0; Result is Mult1/Mult2).
コードを一般化して、さまざまなアリティの問題を解決しようとしています。
アリティ カウントなどは、実際には次のように 6 になります。
attribute(a1,a2,a3,a4,a5,a6).
data(yes,yes,yes,no,no,no).
data(yes,yes,yes,no,no,yes).
私のプログラムは、アリティに合わせて調整する必要があります。どうすればこれを達成できるか分かりますか?