好吧!最後一個Prolog問題很長一段時間!序言隨機和findall插入式
我想挑選是隨機挑選的迴應,但所有我似乎可以做的就是選擇第一個從我的答覆表(見代碼)
我敢肯定,這與做序言「findall」和「random」但是如何?
pick_response(Sent, R) :-
response(Sent, R), !.
pick_response(_,R) :-
punt(R),!.
好吧!最後一個Prolog問題很長一段時間!序言隨機和findall插入式
我想挑選是隨機挑選的迴應,但所有我似乎可以做的就是選擇第一個從我的答覆表(見代碼)
我敢肯定,這與做序言「findall」和「random」但是如何?
pick_response(Sent, R) :-
response(Sent, R), !.
pick_response(_,R) :-
punt(R),!.
一種方式與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.
你的問題是削減。我假設response/2
將在回溯中生成所有可能的響應,並且您希望能夠通過回溯跟蹤並挑選出想要的迴應。如果沒有合適的響應,則punt/1
將生成響應。
如果是這樣,那麼第一個子句中的削減將停止pick_response
和response
回溯,所以你只看到過的第一個解決方案。如果punt/1
生成回溯的解決方案,那麼您也會遇到同樣的問題,但如果它只生成一個解決方案,那麼第二個解決方案是不必要的。
這會移動pick_response
之外的響應的實際挑選,然後真的變爲generate_response
。
這是你想要的嗎?