Пролог случайный и все находки - PullRequest
1 голос
/ 28 января 2010

Хорошо! последний прологический вопрос давно !!

Я пытаюсь выбрать случайный ответ, но все, что я могу сделать, это выбрать первый из моих таблиц ответов (см. Код)

Я уверен, что это сделано с прологами "findall" и "random", но как?

pick_response(Sent, R) :-
    response(Sent, R), !.
pick_response(_,R) :-
    punt(R),!.

Ответы [ 2 ]

3 голосов
/ 28 января 2010

Один из способов сделать это с findall/3 и random/3:

% Responses for sentence 'sentence'
response(sentence, first).
response(sentence, second).
response(sentence, third).

% 1. Generate a list of all responses
% 2. Generate a random integer
% 3. Pick the response with the index of the integer from the list
random_response(Sentence, RandomResponse) :-
    findall(Response, response(Sentence, Response), List),
    length(List, Len),
    random(0, Len, RandomNumber),
    nth0(RandomNumber, List, RandomResponse).

Использование:

?- random_response(sentence, RandomResponse).
RandomResponse = third.

?- random_response(sentence, RandomResponse).
RandomResponse = first.

?- random_response(sentence, RandomResponse).
RandomResponse = second.

?- random_response(sentence, RandomResponse).
RandomResponse = second.

?- random_response(sentence, RandomResponse).
RandomResponse = second.

?- random_response(sentence, RandomResponse).
RandomResponse = third.
0 голосов
/ 29 января 2010

Ваша проблема - порезы. Я предполагаю, что response/2 сгенерирует все возможные ответы при возврате, и вы хотите иметь возможность просмотреть их при отслеживании возврата и выбрать тот, который вы хотите. Если подходящего ответа нет, punt/1 сгенерирует ответ.

Если это так, то сокращение в первом предложении прекратит возврат в pick_response и response, поэтому вы увидите только первое решение. Если punt/1 генерирует решения для обратного отслеживания, то у вас там будет та же проблема, но если она когда-либо генерирует только одно решение, тогда второе не нужно.

Это перемещает фактический выбор ответа за пределы pick_response, который затем действительно становится generate_response.

Это то, что вы хотели?

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