prolog - 在 Prolog 中保留值

标签 prolog variable-assignment

我们可以说:

Sum is 0.
Sum is Sum + 2.

在Prolog中,如果我们想要保留一个值或者想要继续对该变量进行更改?

最佳答案

if we want a value to be retained or want to keep making changes to that variable?

  1. 一般来说,我们不会。
  2. 在极端情况下,我们可以。

我们通过变量名(这是对全局可访问结构的引用)接收一个现有事物,从中构建一个新事物,并将对此新事物的引用填充到另一个变量名中:

   DataOut is 2*DataIn.  % assuming DataIn is numeric, multiply by 2

bar(DataIn,DataOut) :- 
   DataIn  = f(X),       % Disassemble, pick out X, assuming DataIn is a term "f(X)"
   DataOut = g(X).       % Assemble, wrapping X into g

baz(f(X),g(X)).          % the same as bar/2 above, written compactly

“事物”永远不会被存储,它们只是在谓词之间传递。

特别是,对于循环,您不存储任何内容。

以下是对 FromTo 之间的值求和的结果:

% loop(From:integer,To:integer,Sum:integer).

loop(From,From,From).

loop(From,To,Sum) :- 
   To > From,
   ToMinus is To-1,
   loop(From,ToMinus,LowerSum),
   Sum is LowerSum+To.

相对于函数式语言,我们有一点优势,因为它实际上可以在“尚未设置的地方”增长。所以你也可以传递一个“东西”并让它成长:

quux(Data) :- 
   Data = f(X,Y),    % Disassemble, assuming Data is a term "f(X,Y)"
   (var(Y)           % If Y is still an unbound variable
    -> Y = g(Z)      % then set it to a fresh unbound variable wrapped in g
    ;  true).        % Otherwise do nothing

所以:

?- Data=f(X,Y),quux(Data).
Data = f(X,g(_16532)),
Y = g(_16532).

?- Data=f(1,2),quux(Data).
Data = f(1,2).

但是,一旦你习惯了这个想法,你确实可以通过各种方式存储这些东西以供“以后使用”:

阅读这些:

关于prolog - 在 Prolog 中保留值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66425561/

相关文章:

networking - Prolog 中的网络模块化优化

prolog - Prolog 中的状态变量

php - PHP 中的并行数组赋值

python - “范围”对象不支持项目分配 - 尝试在 python 3.3 中使用旧的 python 代码

ruby - 救援条款中的多重赋值?

python - 查找列表中的最大元素

arrays - 序幕,骑士攻击

Prolog 不返回请求值

prolog - swi 序言 : conjunction and cut

c - 为什么我无法存储函数的返回值?