prolog,一种有条件的形式

时间:2010-06-28 00:38:15

标签: prolog probability

好吧,我很难与prolog(gprolog)合作。我的问题是这个,我是下一个谓词:

prob(factA,factB,X,first):-   X=<50.
prob(factA,factB,X,second):-  X>50,X=<80.
prob(factA,factB,X,none):-  X>80,X=<100.
事实上,A有50%的概率发生,事实B有30%,最后有20%的事实发生。另外我还有其他人断言在哪里改变事实B而不是事实A,也改变了X间隔。

现在我有了仿函数:

result(X,Y,N):- random(1,100,I),
  prob(X,Y,I,N).

这个谓词告诉你什么是N的X和Y的概率。这个谓词处理案例:

result(factA,factB,N).

但现在我必须处理:

result(factB,factA,N).

它将返回一个有效的结果,任何想法?,我做了类似的事情:

result(X,Y,N):- Y = factA,
     random(1,100,I),
     prob(Y,X,I,N).
            J is 100-I,
     prob(Y,X,J,N).

但这并不能很好地处理“无”结果。

有人有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

查看上面的评论:如果first为50%(并且如果您“知道”随机值将在1到100之间进行一些优化):

prob(X,first):- X=<50, !.
prob(X,second):- X=<80, !.
prob(X,none).

我想这不是你的意思,因为它根本不依赖于事实,因此不需要它们作为论据。

因此,假设factA为50%,稍微复杂但与您的想法基本相同:

fact_prob(factA, 50).
fact_prob(factB, 30).

random_fact(X, _, I, R) :-
  fact_prob(X, XP),
  I <= XP, !,
  R = first.
random_fact(X, Y, I, R) :-
  fact_prob(X, XP),
  fact_prob(Y, YYP),
  XYP is XP + YP,
  I <= XYP, !,
  R = second.
random_fact(_, _, _, none).

免责声明:我从未使用过gprolog,您可能需要根据您的方言调整细节。