2012-03-08 54 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.