小编use*_*622的帖子

如何避免在Prolog中使用assert和retractall来实现全局(或状态)变量

我往往最终写入的Prolog代码涉及(在整个程序或状态的重要信息)的一些算术计算,通过:首先获得存储在谓词的值,然后重新计算的值,最后使用存储所述值的装置retractallassert因为在Prolog中,我们不能使用两次赋值给变量is(因此几乎每个需要修改的变量都是全局的).我已经知道这在Prolog中不是一个好习惯.在这方面,我想问:

  1. 为什么在Prolog中这是一个不好的做法(虽然我自己不喜欢通过上面提到的步骤只是为了拥有一种灵活的(可修改的)变量)?

  2. 有哪些一般方法可以避免这种做法?小例子将不胜感激.

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))... 一样长,并且有更多的断言谓词来定义更多的变量.这样做是为了使不同功能之间的值的通信成为可能,并在程序运行期间存储变量状态.

最后,我想再知道一件事:尽管您提出了各种解决方案以避免它,但上述做法何时变得不可避免?

prolog dcg prolog-assert implicit-state-passing

6
推荐指数
1
解决办法
1765
查看次数

当缓慢输入时,Vim不会检测命令

我最近在Windows上安装了一个名为未受损的插件,该插件由Tim Pope在vim(gVim)上安装.我使用病原体来管理插件.如果它很重要,我还安装了AutoHotKey来通过一个简单的脚本来交换EscCaps Lock,AutoHotKey可以理解这个脚本.在安装上述插件之前,可以以慢速键入命令,并且vim(gVim)将识别它们.例如,如果您在[p之间稍微暂停一下键入[ p,vim仍会识别该命令.但现在,在安装插件后,当我使用命令时(例如 [b)在插件的文档(helpfile)中提到,当键入键之间的暂停键入时,命令无法识别.但是,当以快速输入时,它们工作正常.此外,本机命令仍然正常工作.插件是以这种方式构建的,还是其他地方出了问题?

vim

1
推荐指数
1
解决办法
38
查看次数

标签 统计

dcg ×1

implicit-state-passing ×1

prolog ×1

prolog-assert ×1

vim ×1