Prolog 公平非二进制随机项

Prolog 公平非二进制随机项,prolog,Prolog,是否有可能获得一个元组列表中的一个项,该项是关于它自己的随机值的,并且具有公平的份额 例如: X = [(0.60, test1), (0.20, test2), (0.20, test3)] 在这种情况下,test1比其他测试有60%的概率被选中。 我尝试使用maybe/1,但这给了我一个“二元机会”,而我希望列表中的每个成员都有一个公平的机会,如果这有意义的话。你可以很容易地适应(我从中复制了谓词choice/3和choice/4): solve:- X = [(0.60, t

是否有可能获得一个元组列表中的一个项,该项是关于它自己的随机值的,并且具有公平的份额

例如:

X = [(0.60, test1),  (0.20, test2),  (0.20, test3)]
在这种情况下,test1比其他测试有60%的概率被选中。
我尝试使用
maybe/1
,但这给了我一个“二元机会”,而我希望列表中的每个成员都有一个公平的机会,如果这有意义的话。

你可以很容易地适应(我从中复制了谓词
choice/3
choice/4
):

solve:-
    X = [(0.60, test1),  (0.20, test2),  (0.20, test3)],
    findall(P,member((P,_),X),LP),
    findall(T,member((_,T),X),LT),
    choice(LT,LP,V),
    writeln(V).

choice([X|_], [P|_], Cumul, Rand, X) :-
    Rand < Cumul + P.
choice([_|Xs], [P|Ps], Cumul, Rand, Y) :-
    Cumul1 is Cumul + P,
    Rand >= Cumul1,
    choice(Xs, Ps, Cumul1, Rand, Y).
choice([X], [P], Cumul, Rand, X) :-
    Rand < Cumul + P.

choice(Xs, Ps, Y) :- random(R), choice(Xs, Ps, 0, R, Y), !.
求解:-
X=[(0.60,测试1),(0.20,测试2),(0.20,测试3)],
芬德尔(P,成员((P,ux),有限合伙人),
芬德尔(T,成员((,T),X),LT),
选择(LT、LP、V),
书面的(V)。
选择([X]、[P]、卡穆尔、兰德、X):-
兰德=积云1,
选择(Xs、Ps、Cumul1、Rand、Y)。
选择([X]、[P]、卡穆尔、兰德、X):-
兰德
然后调用
?-solve
。这是一个基本的解决方案,可以对其进行改进,例如,无需调用
findall/2
两次。。。一个有趣的替代方法是使用概率逻辑编程,请查看。

您可以通过以下方式轻松适应(我从中复制了谓词
choice/3
choice/4
):

solve:-
    X = [(0.60, test1),  (0.20, test2),  (0.20, test3)],
    findall(P,member((P,_),X),LP),
    findall(T,member((_,T),X),LT),
    choice(LT,LP,V),
    writeln(V).

choice([X|_], [P|_], Cumul, Rand, X) :-
    Rand < Cumul + P.
choice([_|Xs], [P|Ps], Cumul, Rand, Y) :-
    Cumul1 is Cumul + P,
    Rand >= Cumul1,
    choice(Xs, Ps, Cumul1, Rand, Y).
choice([X], [P], Cumul, Rand, X) :-
    Rand < Cumul + P.

choice(Xs, Ps, Y) :- random(R), choice(Xs, Ps, 0, R, Y), !.
求解:-
X=[(0.60,测试1),(0.20,测试2),(0.20,测试3)],
芬德尔(P,成员((P,ux),有限合伙人),
芬德尔(T,成员((,T),X),LT),
选择(LT、LP、V),
书面的(V)。
选择([X]、[P]、卡穆尔、兰德、X):-
兰德=积云1,
选择(Xs、Ps、Cumul1、Rand、Y)。
选择([X]、[P]、卡穆尔、兰德、X):-
兰德
然后调用
?-solve
。这是一个基本的解决方案,可以对其进行改进,例如,无需调用
findall/2
两次。。。一个有趣的替代方法是使用概率逻辑编程,请查看