Как вы можете получить доступ к различным позициям списка в Прологе? - PullRequest
0 голосов
/ 08 марта 2012

У меня есть следующая программа 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 ]

1 голос
/ 08 марта 2012

Если вы хотите только один раз для каждого элемента списка, вот возможное определение (в 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) ).

test:

?- get_random([a,b,c,d,e,f],X).
X = e ;
X = f ;
X = d ;
X = b ;
X = c ;
X = a.
1 голос
/ 01 мая 2012

Вы можете сделать ir с помощью maybe http://www.swi -prolog.org / pldoc / man? Предикат = возможно% 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.
1 голос
/ 08 марта 2012
Persons = [person1, person2, person3, person4],
length(Persons, N),
I is random(N),
nth0(I, Persons, P).

объединит P со случайным элементом из списка Persons (в SWI-Prolog).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...