在Prolog中编辑Eliza chatbot
我一直在努力在Prolog中编辑Eliza chatbot。每次我试图编辑某些内容时,都会出现一个新的错误。是否对其进行了任何形式的编辑保护 我使用SWI prolog编辑器进行编辑。问题是我试图在没有完全理解的情况下最小化代码。我试着做一个简单的简短版本。所以,我可能会删除一些必要的东西,也许!比如“我的字符类型”。我得到的错误是“收回/1:没有修改静态过程'rules/1'的权限” 有我能理解的小型聊天机器人的代码吗在Prolog中编辑Eliza chatbot,prolog,Prolog,我一直在努力在Prolog中编辑Eliza chatbot。每次我试图编辑某些内容时,都会出现一个新的错误。是否对其进行了任何形式的编辑保护 我使用SWI prolog编辑器进行编辑。问题是我试图在没有完全理解的情况下最小化代码。我试着做一个简单的简短版本。所以,我可能会删除一些必要的东西,也许!比如“我的字符类型”。我得到的错误是“收回/1:没有修改静态过程'rules/1'的权限” 有我能理解的小型聊天机器人的代码吗 请帮助:“(Prolog有一个静态存储和一个动态存储。如果您打开一个文件,
请帮助:“(Prolog有一个静态存储和一个动态存储。如果您打开一个文件,请说
program.pl
,然后在其中放一些行,如下所示:
foo(tabitha).
foo(darlene).
?- asserta(baz(tabitha)).
true.
?- baz(X).
X = tabitha.
?- retract(baz(tabitha)).
true.
?- baz(X).
false.
:- dynamic foo/1.
这些事实最终会存储在静态存储中。它们不是程序的可变部分(默认情况下)
asserta/1
、assertz/1
和retract/1
和retractall/1
过程构成了动态存储的基础。如果您只是坐在控制台旁,您只需向动态存储添加一些事实,然后通过如下操作将其删除:
foo(tabitha).
foo(darlene).
?- asserta(baz(tabitha)).
true.
?- baz(X).
X = tabitha.
?- retract(baz(tabitha)).
true.
?- baz(X).
false.
:- dynamic foo/1.
但是,如果您在加载program.pl
后坐在提示符处,并尝试收回foo(tabitha)
您将得到静态过程消息:
?- retract(foo(tabitha)).
ERROR: retract/1: No permission to modify static procedure `foo/1'
ERROR: Defined at /Users/fusion/program.pl:1
原因是foo/1
事实被放置在静态存储中而不是动态存储中,因为您没有使用asserta/1
或assertz/1
将它们放在那里,也没有将谓词声明为动态,如下所示:
foo(tabitha).
foo(darlene).
?- asserta(baz(tabitha)).
true.
?- baz(X).
X = tabitha.
?- retract(baz(tabitha)).
true.
?- baz(X).
false.
:- dynamic foo/1.
因此,有两条前进的道路:
规则/1
谓词动态make.
来完成
我推荐选项#1,否则,当您喜欢您的工作程序时,很难重建它的状态。SWISH有过,我有下面的旧代码,用于测试我的工作程序
下面是一个示例会话
1 ?- eliza.
? i am hungry
how long have you been hungry ?
? very long
please go on
? bye
Goodbye. I hope I have helped you
true.
SWI Prolog测试版本,从下面的ELIZA.IL移植(唉,SWISH显然缺少IO原语,比如从代码中读取代码,所以粘贴完整代码更简单)
旧代码:和请提供更多信息帮助我们了解您的问题,如您是如何编辑的以及它抛出了什么错误。感谢您的回复!我已经编辑了该帖子。我希望您能提供帮助:)先生,首先,我要感谢您的旧评论,它帮助我找到了原始Eliza chatbot的代码!现在,我的Prolog一点都不好,我只有一个作业。我在SWISH和SWI-prolog中都尝试了您的代码,但都不起作用。我写了“再见”一词,但没有回应:(你能告诉我你在SWI上使用的是什么版本吗?还有,在这个cahtbot中添加更多规则而不出错的正确方法是什么。谢谢你的时间,先生。我用最新版本的SWI Prolog对它进行了测试,但我相当肯定它在任何版本下都能工作。在SWISH中,正如我所说的,似乎没有输入功能…你应该将上述代码保存在名为(即)eliza.pl的文件中,然后在SWI Prolog提示符中:
?-[eliza],eliza.
要调试,请输入?-leash(-all),trace.
在开始之前?-eliza.
。向聊天机器人添加规则可能会很棘手,如果您仍然不了解代码是如何工作的。谢谢,它是如何工作的。但是编写命令的正确方式是什么?我的意思是写“再见”没有任何格式样式都不起作用。这是否会像原来的Eliza?非常感谢!原来的Eliza是一个复杂的Lisp程序。我不知道你指的是哪个Prolog程序。我发布了一个工作代码,只需在输入时用单引号将短语包装起来。我指的是你在这篇文章中的评论,我还注意到你添加了这个(使用_模块(library(readutil))!现在,每次我点击RUN时,SWISH都会弹出一个窗口说“正在输入Prolog查询”