我需要编写一个进程,在该进程中程序应该运行一些基于"状态变量"的规则,然后我需要能够更改此Status变量以继续进程。但我不知道是否有类似于"状态变量"的任何想法,我怎么能实现它?
答案 0 :(得分:3)
您的状态变量"可能是一个事实,它被断言(或收回)以反映所需的信号,虽然我不认为你可以在执行证明的同时做出这样的改变。
我认为在原始流程卡住"时断言您需要的状态会更加清晰,而是在状态发生变化时发出新的查询,然后可以使用该状态。
答案 1 :(得分:1)
使用动态变量的声明性替代方法,正如Scott在他的回答中所建议的那样,是使用流变量。我们的想法是创建并初始化一个新的流变量,将其作为逻辑变量传递给您的规则,并在需要时使用新值更新它。规则将随时访问(或更新)流变量的当前值。使用流变量的Logtalk实现的一个例子应该清楚(你可以使用Logtalk作为大多数Prolog编译器的库,包括SWI-Prolog):
?- {library(streamvars)}.
% [ /Users/pmoura/logtalk/library/streamvars.lgt loaded ]
% (0 warnings)
true.
?- streamvars::new(SV, 1).
SV = [_G9, v(1)|_G13].
请注意,流变量SV
由带有未绑定尾部的列表表示,这允许我们向其添加新值。 streamvars
对象提供用于创建新流变量,访问其当前值以及更新其值的谓词。一个简单的用法是:
?- streamvars::new(SV, 1), streamvars::'=>'(SV, V1), streamvars::'<='(SV, 2), streamvars::'=>'(SV, V2).
SV = [v(_G31), v(1), v(2)|_G34],
V1 = 1,
V2 = 2.
=>/2
和<=/2
谓词对于某些语法糖有相应的运算符定义,尽管上面没有使用它们。您的规则将根据需要使用这些访问和更新谓词,并将流变量从规则传递(线程化)到规则。
streamvars
的完整文档可在以下网址查阅:
http://logtalk.org/library/streamvars_0.html
反过来可以在以下网址查阅源代码:
https://github.com/LogtalkDotOrg/logtalk3/blob/master/library/streamvars.lgt
代码很简单,您可以轻松地将其调整到您的应用程序中。使用流变量实现的一个可能的缺点是,如上所示,保留了所有过去的元素。如果在您的情况下这是一个问题,那么您将需要求助于非声明性解决方案,例如使用一些Prolog系统中提供的动态谓词或变量(即全局变量)。