我往往最终写入的Prolog代码涉及(在整个程序或状态的重要信息)的一些算术计算,通过:首先获得存储在谓词的值,然后重新计算的值,最后使用存储所述值的装置retractall
和assert
因为在Prolog中,我们不能使用两次赋值给变量is
(因此几乎每个需要修改的变量都是全局的).我已经知道这在Prolog中不是一个好习惯.在这方面,我想问:
为什么在Prolog中这是一个不好的做法(虽然我自己不喜欢通过上面提到的步骤只是为了拥有一种灵活的(可修改的)变量)?
有哪些一般方法可以避免这种做法?小例子将不胜感激.
PS我刚开始学习Prolog.我确实有C语言的编程经验.
我想说的一个不好的例子(在win-prolog中)如下:
:- dynamic(value/1).
:- assert(value(0)).
adds :-
value(X),
NewX is X + 4,
retractall(value(_)),
assert(value(NewX)).
mults :-
value(Y),
NewY is Y * 2,
retractall(value(_)),
assert(value(NewY)).
start :-
retractall(value(_)),
assert(value(3)),
adds,
mults,
value(Q),
write(Q).
Run Code Online (Sandbox Code Playgroud)
然后我们可以查询如下:
?- start.
Run Code Online (Sandbox Code Playgroud)
在这里,它非常简单,但在实际程序和应用中,上面显示的全局变量方法变得不可避免.有时候,上面给出的列表就像assert(value(0))
... 一样长,并且有更多的断言谓词来定义更多的变量.这样做是为了使不同功能之间的值的通信成为可能,并在程序运行期间存储变量状态.
最后,我想再知道一件事:尽管您提出了各种解决方案以避免它,但上述做法何时变得不可避免?
我最近在Windows上安装了一个名为未受损的插件,该插件由Tim Pope在vim(gVim)上安装.我使用病原体来管理插件.如果它很重要,我还安装了AutoHotKey来通过一个简单的脚本来交换Esc和Caps Lock,AutoHotKey可以理解这个脚本.在安装上述插件之前,可以以慢速键入命令,并且vim(gVim)将识别它们.例如,如果您在[和p之间稍微暂停一下键入[ p,vim仍会识别该命令.但现在,在安装插件后,当我使用命令时(例如 [b)在插件的文档(helpfile)中提到,当键入键之间的暂停键入时,命令无法识别.但是,当以快速输入时,它们工作正常.此外,本机命令仍然正常工作.插件是以这种方式构建的,还是其他地方出了问题?