Random Prolog中的随机项

Random Prolog中的随机项,random,prolog,swi-prolog,Random,Prolog,Swi Prolog,我知道我可以做X是随机的(10)。获取0到10之间的随机数,但是是否有类似的命令获取随机匹配项?您可以实现它。以下是一个版本: %% 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),

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

您可以实现它。以下是一个版本:

%% 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).

开始,SWI Prolog v6具有如下定义的随机成员/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.

不过,您可能想在
(-,+)
模式下使用它。

哇,choose/2的第一个子句不是您想要的。如果列表为空,则不应生成解决方案,而应将Elt与空列表统一起来。“选择([],\:-!,失败。”将修复它。此外,这会产生无穷多的解决方案,这通常是不可取的。