首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从XPCE传递选择值以生成prolog代码

如何从XPCE传递选择值以生成prolog代码
EN

Stack Overflow用户
提问于 2013-01-27 16:30:55
回答 2查看 711关注 0票数 2

我想要传递COD,DB,Wounds和Medical的值来计算概率。

我已经编写了XPCE代码作为GUI,如下所示。

代码语言:javascript
复制
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代码如下:

代码语言:javascript
复制
 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=probability的计算值。如果我的代码很混乱,我很抱歉。也许我是一个用prolog处理变量的新手。请帮助me..Thank u。

EN

回答 2

Stack Overflow用户

发布于 2013-01-27 17:57:20

我不知道这是否是您想要的,但是我编写了这段代码,当您单击OK时,它会给出在对话框中选择的内容:

代码语言:javascript
复制
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).

例如:

代码语言:javascript
复制
 ?- list.
[suicide,hanging_dead_body,offensive_injuries,state of mind]
true.
票数 1
EN

Stack Overflow用户

发布于 2013-01-27 18:48:37

您应该定义prob/4过程。例如

代码语言:javascript
复制
prob(COD,DB,Wounds,Medical) :-
    writeln([COD,DB,Wounds,Medical]).

我以这种方式更改了对话框

代码语言:javascript
复制
...
send_list(Medical,append,H),
send(D, open).

当我单击OK prob/4get时,会调用实际的选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14545720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档