2010-01-28 45 views
1

好吧!最後一個Prolog問題很長一段時間!序言隨機和findall插入式

我想挑選是隨機挑選的迴應,但所有我似乎可以做的就是選擇第一個從我的答覆表(見代碼)

我敢肯定,這與做序言「findall」和「random」但是如何?

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

回答

3

一種方式與findall/3random/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

這是你想要的嗎?