在 Prolog 中编辑 Eliza 聊天机器人

D.X*_*D.X 5 prolog

我一直在努力尝试在 Prolog 中编辑 Eliza 聊天机器人。每次我尝试编辑某些内容时,都会出现一个新错误。它是否受任何类型的编辑保护?

我使用 SWI-prolog 编辑器进行了编辑。问题是我试图在没有完全理解的情况下最小化代码。我正在尝试做一个简单的简短版本。所以,我可能会删除一些重要的东西!例如“my_char_type”。我得到的错误是“retract/1: No permission to modify static procedure `rules/1'”

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

请帮忙 :'(

Dan*_*ons 2

Prolog 有静态存储和动态存储。如果您打开一个文件,program.pl然后在其中添加一些行,如下所示:

foo(tabitha).
foo(darlene).
Run Code Online (Sandbox Code Playgroud)

这些事实最终会被保存在静态存储中。它们不是程序的可变部分(默认情况下)。

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

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

?- baz(X).
X = tabitha.

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

?- baz(X).
false.
Run Code Online (Sandbox Code Playgroud)

但是,如果您在加载后出现提示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
Run Code Online (Sandbox Code Playgroud)

原因是因为foo/1事实被放置在静态存储中而不是动态存储中,因为您没有使用asserta/1orassertz/1或将谓词声明为动态将它们放在那里,如下所示:

:- dynamic foo/1.
Run Code Online (Sandbox Code Playgroud)

所以有两条路可以前进:

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

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

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