Prolog中的随机项

7

我知道可以使用X is random(10)来获取0到10之间的随机数,但是是否有类似的命令可以获取随机匹配项?

2个回答

7

SWI-Prolog v6 中 random_member/2 的定义如下:

?- listing(random_member).
random:random_member(D, A) :-
    length(A, B),
    C is random(B),
    nth0(C, A, D).

使用示例:

?- random_member(a(N), [a(1), a(2), b(3)]).
N = 1.

?- random_member(a(N), [a(1), a(2), b(3)]).
N = 1.

?- random_member(a(N), [a(1), a(2), b(3)]).
N = 2.

?- random_member(a(N), [a(1), a(2), b(3)]).
false.

?- random_member(a(N), [a(1), a(2), b(3)]).
false.

?- random_member(a(N), [a(1), a(2), b(3)]).
N = 2.

你可能想要在(-,+)模式下使用它。


5
您可以实现它,这里是一个版本:
%% choose(List, Elt) - chooses a random element
%% in List and unifies it with Elt.
choose([], []).
choose(List, Elt) :-
        length(List, Length),
        random(0, Length, Index),
        nth0(Index, List, Elt).

来自http://ozone.wordpress.com/2006/02/22/little-prolog-challenge/


2
哇哦,choose/2 的第一个子句不是你想要的。如果列表为空,你应该产生零个解而不是将 Elt 统一为空列表。"choose([],_) :- !, fail." 可以修复它。此外,这会生成无限数量的解决方案,通常是不可取的。 - rndmcnlly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接