在Prolog中编辑Eliza chatbot

我一直在努力尝试在Prolog中编辑Eliza聊天机器人.每次我尝试编辑某些内容时,都会显示一个新错误.它受到任何编辑的保护吗?

我使用SWI-prolog编辑器编辑.问题是我试图在不完全理解代码的情况下最小化代码.我正在尝试做一个简单的短版本.所以,我可能会删除一些必要的东西!比如“my_char_type”.我得到的错误是“撤消/ 1:无权修改静态过程`rules / 1’”

我能理解的小聊天机器人是否有任何代码?

请帮忙 :'(

最佳答案 Prolog有一个静态商店和一个动态商店.如果你打开一个文件,比如说program.pl,你就像这样在里面添加一些代码:

foo(tabitha).
foo(darlene).

这些事实在静态商店中结束.它们不是程序的可变部分(默认情况下).

asserta / 1,assertz / 1和retract / 1以及retractall / 1过程构成了动态存储的基础.如果您只是坐在控制台上,您可以将一些事实添加到动态存储中,并通过执行以下操作将其删除:

?- asserta(baz(tabitha)).
true.

?- baz(X).
X = tabitha.

?- retract(baz(tabitha)).
true.

?- baz(X).
false.

但是,如果您在加载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中,或者将谓词声明为动态,如下所示:

:- dynamic foo/1.

所以前进有两种方式:

>直接编辑程序源并重新加载.
>如上所述声明rules / 1谓词动态.

顺便说一句,在SWI-Prolog中重新加载最好通过运行make来完成.从提示.

我建议选项#1,否则当你喜欢它正在做的事情时,很难重建你的工作程序的状态.

点赞