我一直在努力尝试在 Prolog 中编辑 Eliza 聊天机器人。每次我尝试编辑某些内容时,都会出现一个新错误。它是否受任何类型的编辑保护?
我使用 SWI-prolog 编辑器进行了编辑。问题是我试图在没有完全理解的情况下最小化代码。我正在尝试做一个简单的简短版本。所以,我可能会删除一些重要的东西!例如“my_char_type”。我得到的错误是“retract/1: No permission to modify static procedure `rules/1'”
有没有我能理解的小型聊天机器人的代码?
请帮忙 :'(
Prolog 有静态存储和动态存储。如果您打开一个文件,program.pl然后在其中添加一些行,如下所示:
foo(tabitha).
foo(darlene).
Run Code Online (Sandbox Code Playgroud)
这些事实最终会被保存在静态存储中。它们不是程序的可变部分(默认情况下)。
、asserta/1、assertz/1和过程构成retract/1了retractall/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)
所以有两条路可以前进:
rules/1如上声明谓词动态。顺便说一句,在 SWI-Prolog 中重新加载最好通过make.提示符运行来完成。
我会推荐选项#1,否则当你喜欢它正在做的事情时,将很难重建你的工作程序的状态。
| 归档时间: |
|
| 查看次数: |
2535 次 |
| 最近记录: |