在Prolog中编辑Eliza chatbot

在Prolog中编辑Eliza chatbot,prolog,Prolog,我一直在努力在Prolog中编辑Eliza chatbot。每次我试图编辑某些内容时,都会出现一个新的错误。是否对其进行了任何形式的编辑保护 我使用SWI prolog编辑器进行编辑。问题是我试图在没有完全理解的情况下最小化代码。我试着做一个简单的简短版本。所以,我可能会删除一些必要的东西,也许!比如“我的字符类型”。我得到的错误是“收回/1:没有修改静态过程'rules/1'的权限” 有我能理解的小型聊天机器人的代码吗 请帮助:“(Prolog有一个静态存储和一个动态存储。如果您打开一个文件,

我一直在努力在Prolog中编辑Eliza chatbot。每次我试图编辑某些内容时,都会出现一个新的错误。是否对其进行了任何形式的编辑保护

我使用SWI prolog编辑器进行编辑。问题是我试图在没有完全理解的情况下最小化代码。我试着做一个简单的简短版本。所以,我可能会删除一些必要的东西,也许!比如“我的字符类型”。我得到的错误是“收回/1:没有修改静态过程'rules/1'的权限”

有我能理解的小型聊天机器人的代码吗


请帮助:“(

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
    谓词动态
  • 顺便说一句,在SWI Prolog中重新加载最好通过在提示符下运行
    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查询”