如何在Prolog中访问列表的不同位置?

时间:2012-03-08 16:28:09

标签: list prolog

我有以下Prolog程序:

father(person1,person2).
mother(person3,person2).

 say_hi(X) :- father(X,person1) , write('Hello1').
 say_hi(X) :- father(X,person2) , write('Hello2').

我想要一个不同句子的列表:每次你调用say_hi

时,程序应该返回不同的句子

因此,该计划的预期输出应为:

 ?- say_hi(person1)
 Hello1
 ?- say_hi(person1)
 Hello3
 ?- say_hi(person4)
 Hello4

列表的不同元素应以随机方式编写

3 个答案:

答案 0 :(得分:1)

Persons = [person1, person2, person3, person4],
length(Persons, N),
I is random(N),
nth0(I, Persons, P).

会将P与列表Persons中的随机元素统一起来(在SWI-Prolog中)。

答案 1 :(得分:1)

如果你只需要每个列表'元素一次,这里有一个可能的定义(在SWI-Prolog中),它返回回溯的元素:

get_random([E], E) :- !.
get_random(L, E) :-
    length(L, C),
    R is random(C),
    length(Skip, R),
    append(Skip, [X|Tail], L),
    ( E = X
    ; append(Skip, Tail, Rest),
      get_random(Rest, E) ).

试验:

?- get_random([a,b,c,d,e,f],X).
X = e ;
X = f ;
X = d ;
X = b ;
X = c ;
X = a.

答案 2 :(得分:1)

你可以使用maybe http://www.swi-prolog.org/pldoc/man?predicate=maybe%2f1 但我无法管理它。 所以我已经制作了自己的谓词:

maybe(P):-
    random(N),
    N<P.

maybe :- maybe(0.5).

我无法理解你的初始代码,所以我稍微改了一下。

say_hi :- maybe, write('Hello1').
say_hi :- write('Hello2').


?- say_hi.
Hello2
true.

?- say_hi.
Hello1
true .

?- say_hi.
Hello2
true.