如何从XPCE传递选择值以生成prolog代码
我想通过COD、DB、伤口和医疗数据来计算概率 我已经编写了XPCE代码作为GUI,如下所示如何从XPCE传递选择值以生成prolog代码,prolog,swi-prolog,xpce,Prolog,Swi Prolog,Xpce,我想通过COD、DB、伤口和医疗数据来计算概率 我已经编写了XPCE代码作为GUI,如下所示 list:- new(D,dialog('Enter Evidence')), send_list(D,append, [new(COD,menu(cause_of_death,choice)), new(DB,menu(dead_body,cycle)), new(Wounds,menu(wound_and_injuries,cycle)), new(Medical,menu(m
list:-
new(D,dialog('Enter Evidence')),
send_list(D,append,
[new(COD,menu(cause_of_death,choice)),
new(DB,menu(dead_body,cycle)),
new(Wounds,menu(wound_and_injuries,cycle)),
new(Medical,menu(medical_evidence,cycle)),
new(_,button('OK',message(@prolog,prob,COD?selection,DB?selection,Wounds?selection,Medical?selection)))]),
send_list(COD,append,[suicide,homicide]),
findall(X,db_evidence(X),Y),
send_list(DB, append,Y),
findall(E,i_evidence(E),F),
send_list(Wounds, append,F),
findall(G,m_evidence(G),H),
send_list(Medical, append,H),
get(D,confirm, Answer),
get(Answer, element(1), A),
get(A, selection, AV),
get(Answer, element(2), B),
get(B, selection, BV),
get(Answer, element(3), C),
get(C, selection, CV),
Q = [AV, BV, CV],
db_evidence(hanging_dead_body).
i_evidence(offensive_injuries).
i_evidence(head_injuries).
i_evidence(markings).
m_evidence('state of mind').
m_evidence(traces_of_anaesthetic).
我计算概率的prolog代码如下:
prob( COD,Q, P) :-
delete( Y, Q, Cond),
% predecessor( X, Y), !, % Y is a descendant of X
prob( X, Cond, Px),
prob( Y, [X | Cond], PyGivenX),
prob( Y, Cond, Py),
P is Px * PyGivenX / Py, % Assuming Py > 0
p(hanging_dead_body, 0.1).
p(offensive_injuries,0.05).
p(head_injuries, 0.5).
p(markings,0.2).
p('state of mind',0.1).
p(traces_of_anaesthetic,0.3).
% suicidal table
p( suicide, [hanging_dead_body,markings,traces_of_anaesthetic], 0.8).
结果应显示p=概率的计算值。如果我的代码很混乱,我很抱歉。也许我对在prolog中使用变量还比较陌生。请帮助我..谢谢。我不知道这是否是您想要的,但我编写了以下代码,当您单击“确定”时,该代码将显示在对话框中选择的内容:
list:-
new(D,dialog('Enter Evidence')),
send_list(D,append,
[new(COD,menu(cause_of_death,choice)),
new(DB,menu(dead_body,cycle)),
new(Wounds,menu(wound_and_injuries,cycle)),
new(Medical,menu(medical_evidence,cycle)),
new(_,button('OK',
message(D, return,
[COD?selection,DB?selection,
Wounds?selection,Medical?selection])))]),
send_list(COD,append,[suicide,homicide]),
findall(X,db_evidence(X),Y),
send_list(DB, append,Y),
findall(E,i_evidence(E),F),
send_list(Wounds, append,F),
findall(G,m_evidence(G),H),
send_list(Medical, append,H),
get(D,confirm, Answer),
get(Answer, element(1), A),
get(A, value, AV),
get(Answer, element(2), B),
get(B, value, BV),
get(Answer, element(3), C),
get(C, value, CV),
get(Answer, element(4), E),
get(E, value, EV),
Q = [AV, BV, CV, EV],
writeln(Q).
例如:
?- list.
[suicide,hanging_dead_body,offensive_injuries,state of mind]
true.
您应该定义prob/4程序。比如说
prob(COD,DB,Wounds,Medical) :-
writeln([COD,DB,Wounds,Medical]).
我以这种方式更改了对话框
...
send_list(Medical,append,H),
send(D, open).
当我点击OK时,prob/4会被实际选项调用。您的代码不完整:Q=[AV,BV,CV]之后的列表代码,p之后的prob代码是Px*PyGivenX/Py,可能是拼写错误,“,”而不是“.”?thanx。但这不是我想要的结果。我想计算P的概率结果。无论如何,谢谢你。