Prolog 返回可能的答案列表
我有一个任务要做一个“简单”的聊天机器人,我现在的主要问题是一个谓词,它接收一个原子列表(例如:[“good”,“morning”]),并且应该返回一个已经在结构中定义的可能答案列表。谓词还需要过滤关键字,并且只返回包含给定列表中关键字的答案 我已经尝试检查列表中的元素是否已经在任何已定义的答案中定义。如果是,它将与返回列表相关联。 (这个concat谓词是由教师定义的,基本上是已经定义的append/3) 当我使用answer([“good”],List)运行它时,它会运行到一个无限循环(我假设它是一个无限循环,因为它需要很长时间才能运行,并且给我一个错误,说堆栈中没有剩余空间) 在这种情况下,输出应该是[“早上好”、“下午好”、“晚上好”]。Prolog 返回可能的答案列表,prolog,chatbot,Prolog,Chatbot,我有一个任务要做一个“简单”的聊天机器人,我现在的主要问题是一个谓词,它接收一个原子列表(例如:[“good”,“morning”]),并且应该返回一个已经在结构中定义的可能答案列表。谓词还需要过滤关键字,并且只返回包含给定列表中关键字的答案 我已经尝试检查列表中的元素是否已经在任何已定义的答案中定义。如果是,它将与返回列表相关联。 (这个concat谓词是由教师定义的,基本上是已经定义的append/3) 当我使用answer([“good”],List)运行它时,它会运行到一个无限循环(我假
我感谢所有能得到的帮助。我们这里有很多问题,从你的问题开始 如果没有
concat/3
以及如何调用代码,任何人都不可能解决您的问题。没有一个谓词只接受一个参数,但是如果使用一个参数调用代码,那么代码将进入无限循环。因此,我们能做的最好的事情就是猜测,直到你用遗漏的细节改进你的问题
以下是我推测的假设:concat/3
可能是append/3
。您正在呼叫应答([“good”],Ans)
查看您的代码,concat(List,H,List)
在我看来非常错误,原因有两个:
H
中提供了一个要连接到list
的非列表List
从未收到初始绑定,因此很可能必须使用参数[]
调用此谓词,这意味着您将其视为输入值和输出值
我认为您的直觉在这里是正确的:您应该可以使用append/3
通过前缀查找内容。不幸的是,SWI Prolog不再将字符串存储为列表,因此必须使用另一个谓词:string\u concat/3
我不认为你能轻易地得到你想要的回报值。我认为您需要使用findall/3
或它的一个朋友来获得多个解决方案,如果您提供一个可能的前缀列表,您将获得一个可能的解决方案列表。也许我错过了一些明显的东西。无论如何,这就是我找到的解决方案:
answer([], []).
answer([H|T], [Answers|R]) :-
findall(Answer,
(ans(Answer, _), string_concat(H, _, Answer)),
Answers),
answer(T, R).
这为我提供了以下输出:
?- answer(["Good"], L).
L = [["Good Morning", "Good Afternoon", "Good Night"]].
请更正您的问题,以便我们能为您提供更多帮助 我们这里有很多问题,从你的问题开始 如果没有
concat/3
以及如何调用代码,任何人都不可能解决您的问题。没有一个谓词只接受一个参数,但是如果使用一个参数调用代码,那么代码将进入无限循环。因此,我们能做的最好的事情就是猜测,直到你用遗漏的细节改进你的问题
以下是我推测的假设:concat/3
可能是append/3
。您正在呼叫应答([“good”],Ans)
查看您的代码,concat(List,H,List)
在我看来非常错误,原因有两个:
H
中提供了一个要连接到list
的非列表List
从未收到初始绑定,因此很可能必须使用参数[]
调用此谓词,这意味着您将其视为输入值和输出值
我认为您的直觉在这里是正确的:您应该可以使用append/3
通过前缀查找内容。不幸的是,SWI Prolog不再将字符串存储为列表,因此必须使用另一个谓词:string\u concat/3
我不认为你能轻易地得到你想要的回报值。我认为您需要使用findall/3
或它的一个朋友来获得多个解决方案,如果您提供一个可能的前缀列表,您将获得一个可能的解决方案列表。也许我错过了一些明显的东西。无论如何,这就是我找到的解决方案:
answer([], []).
answer([H|T], [Answers|R]) :-
findall(Answer,
(ans(Answer, _), string_concat(H, _, Answer)),
Answers),
answer(T, R).
这为我提供了以下输出:
?- answer(["Good"], L).
L = [["Good Morning", "Good Afternoon", "Good Night"]].
请更正您的问题,以便我们能为您提供更多帮助如果你的实现将双引号字符串的传统表示放弃为整数列表,那么很难使用DCG。考虑这个问题,如果你的实现放弃了双引号字符串的传统表示作为整数列表,那么很难使用DCG。我发现我的问题有点让人困惑。我会更新的。谢谢你的解释,我做了很多错事。听了你的解释,我发现我的问题有点让人困惑。我会更新的。谢谢你解释我做错了很多事。