2012-03-08 70 views
0

我有以下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 

列表中的不同元素应该写在一个随机的方式

回答

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. 
1
Persons = [person1, person2, person3, person4], 
length(Persons, N), 
I is random(N), 
nth0(I, Persons, P). 

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

1

你可以使ir与maybehttp://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.