标签: implicit-state-passing

如何避免在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
查看次数