Prolog 返回可能的答案列表

Prolog 返回可能的答案列表,prolog,chatbot,Prolog,Chatbot,我有一个任务要做一个“简单”的聊天机器人,我现在的主要问题是一个谓词,它接收一个原子列表(例如:[“good”,“morning”]),并且应该返回一个已经在结构中定义的可能答案列表。谓词还需要过滤关键字,并且只返回包含给定列表中关键字的答案 我已经尝试检查列表中的元素是否已经在任何已定义的答案中定义。如果是,它将与返回列表相关联。 (这个concat谓词是由教师定义的,基本上是已经定义的append/3) 当我使用answer([“good”],List)运行它时,它会运行到一个无限循环(我假

我有一个任务要做一个“简单”的聊天机器人,我现在的主要问题是一个谓词,它接收一个原子列表(例如:[“good”,“morning”]),并且应该返回一个已经在结构中定义的可能答案列表。谓词还需要过滤关键字,并且只返回包含给定列表中关键字的答案

我已经尝试检查列表中的元素是否已经在任何已定义的答案中定义。如果是,它将与返回列表相关联。 (这个concat谓词是由教师定义的,基本上是已经定义的append/3)

当我使用answer([“good”],List)运行它时,它会运行到一个无限循环(我假设它是一个无限循环,因为它需要很长时间才能运行,并且给我一个错误,说堆栈中没有剩余空间) 在这种情况下,输出应该是[“早上好”、“下午好”、“晚上好”]。
我感谢所有能得到的帮助。

我们这里有很多问题,从你的问题开始

如果没有
concat/3
以及如何调用代码,任何人都不可能解决您的问题。没有一个谓词只接受一个参数,但是如果使用一个参数调用代码,那么代码将进入无限循环。因此,我们能做的最好的事情就是猜测,直到你用遗漏的细节改进你的问题

以下是我推测的假设:
concat/3
可能是
append/3
。您正在呼叫
应答([“good”],Ans)

查看您的代码,
concat(List,H,List)
在我看来非常错误,原因有两个:

  • 您正在尝试对列表进行变异,这在Prolog中是不可能的(变量一旦绑定就不能更改)
  • 您在
    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)
    在我看来非常错误,原因有两个:

  • 您正在尝试对列表进行变异,这在Prolog中是不可能的(变量一旦绑定就不能更改)
  • 您在
    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"]].
    

    请更正您的问题,以便我们能为您提供更多帮助