好的!很长一段时间的最后一个Prolog问题!
我试图选择一个随机选择的响应,但我所能做的似乎就是从我的响应表中选择第一个响应(参见代码)
我确信这是用Prologs的"findall“和"random”来完成的,但是如何完成呢?
pick_response(Sent, R) :-
response(Sent, R), !.
pick_response(_,R) :-
punt(R),!.发布于 2010-01-28 12:19:26
使用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.发布于 2010-01-30 02:47:09
你的问题是割伤。我假设response/2将生成所有可能的回溯响应,并且您希望能够在回溯过程中逐步执行这些响应,并挑选出您想要的响应。如果没有合适的响应,那么punt/1将生成一个响应。
如果是这样,那么第一个子句中的剪切将停止在pick_response和response中的回溯,因此您将只看到第一个解决方案。如果punt/1生成的解决方案是回溯,那么你也会遇到同样的问题,但如果它只生成一个解决方案,那么第二个解决方案就没有必要了。
这将把对响应的实际挑选移到pick_response之外,然后它就变成了generate_response。
这是你想要的吗?
https://stackoverflow.com/questions/2152164
复制相似问题