我有以下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
列表的不同元素应以随机方式编写
答案 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.