如何在prolog中根据算术对程序进行泛化?

如何在prolog中根据算术对程序进行泛化?,prolog,arity,Prolog,Arity,我使用swi-prolog。我有一个这样的事实基础,由算术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). 我的代码在调用pbayesyes时计算结果的概率,no,no,Result p(ColumnName,ColumnValue,Result):- ( (Colu

我使用swi-prolog。我有一个这样的事实基础,由算术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).
我的代码在调用pbayesyes时计算结果的概率,no,no,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).
我试图用不同的算术公式来概括我的代码来解决问题

例如,arity count可以是6,实际上基数如下:

attribute(a1,a2,a3,a4,a5,a6).
data(yes,yes,yes,no,no,no).
data(yes,yes,yes,no,no,yes).

我的程序必须自我调整以适应算术。你知道我怎样才能做到这一点吗?

把所有的参数放在一个列表中,比如

attribute([a1,a2,a3,a4,a5,a6]).
data([yes,yes,yes,no,no,no]).
data([yes,yes,yes,no,no,yes]).
然后递归地处理数据就是我要做的

如果出于某种原因,希望谓词具有不同的算术数,可以使用运算符获取列表中的参数,然后对其进行处理


或者您可以为每个arity XD编写代码。univ谓词允许我们将复合项转换为列表,反之,列表中的第一项是函子,其余项是参数。Prolog事实是一种特殊的术语,其中函子是谓词。顺便说一句,prolog不是真正的函数式编程,因此您可能需要重新标记问题