2010-01-28 4 views
1

Ok! 마지막으로 프롤로그 질문에 오랜 시간 동안 !!프롤로그 임의 및 findall buit-ins

내가이 함께 할 확신합니다

을 (코드 참조) 나는 무작위로 선택됩니다 응답을 선택하기 위해 노력하고있어하지만 내가 할 것으로 보인다 수있는 모든 응답의 내 테이블 중 첫 번째를 선택이다 Prologs "findall"과 "random"하지만 어떻게? findall/3random/3 함께 할 수있는

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

답변

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

귀하의 문제는 상처입니다. response/2은 역 추적에 대한 모든 가능한 응답을 생성하고 역 추적을 통해 단계별로 수행하고 원하는 것을 골라 낼 수 있기를 원합니다. 적절한 응답이 없으면 punt/1이 응답을 생성합니다.

이렇게하면 첫 번째 절의 잘라 내기가 pick_responseresponse의 역 추적을 중지하므로 첫 번째 해결 방법 만 표시됩니다. punt/1가 역 추적을 생성하는 경우 동일한 문제가 발생하지만 한 솔루션 만 생성하면 두 번째 매개 변수는 필요하지 않습니다.

pick_response 외부의 응답 선택이 실제로 generate_response이됩니다.

의도 한 내용입니까?