好吧,我很难与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).
但这并不能很好地处理“无”结果。
有人有什么想法吗?
谢谢!
答案 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,您可能需要根据您的方言调整细节。