首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog random和findall buit-ins

Prolog random和findall buit-ins
EN

Stack Overflow用户
提问于 2010-01-28 11:44:16
回答 2查看 607关注 0票数 1

好的!很长一段时间的最后一个Prolog问题!

我试图选择一个随机选择的响应,但我所能做的似乎就是从我的响应表中选择第一个响应(参见代码)

我确信这是用Prologs的"findall“和"random”来完成的,但是如何完成呢?

代码语言:javascript
复制
pick_response(Sent, R) :-
    response(Sent, R), !.
pick_response(_,R) :-
    punt(R),!.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-28 12:19:26

使用findall/3random/3的一种方法是:

代码语言:javascript
复制
% 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).

用法:

代码语言:javascript
复制
?- 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.
票数 3
EN

Stack Overflow用户

发布于 2010-01-30 02:47:09

你的问题是割伤。我假设response/2将生成所有可能的回溯响应,并且您希望能够在回溯过程中逐步执行这些响应,并挑选出您想要的响应。如果没有合适的响应,那么punt/1将生成一个响应。

如果是这样,那么第一个子句中的剪切将停止在pick_responseresponse中的回溯,因此您将只看到第一个解决方案。如果punt/1生成的解决方案是回溯,那么你也会遇到同样的问题,但如果它只生成一个解决方案,那么第二个解决方案就没有必要了。

这将把对响应的实际挑选移到pick_response之外,然后它就变成了generate_response

这是你想要的吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2152164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档