【问题标题】:Retaining values in Prolog在 Prolog 中保留值
【发布时间】:2021-03-01 16:06:33
【问题描述】:

我们可以说:

Sum is 0.
Sum is Sum + 2.

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

【问题讨论】:

  • 或者你的意思是在交互式会话中,在提示下,我回答了一个完全不同的问题?如果是,那么我想每个 Prolog 系统都有自己的机制,如果有的话。在 SWI 中,我们可以引用前面带有 $ 的先前“设置”逻辑变量,例如 ?- X=1. 然后 ?- Y = [$X].
  • @WillNess no 你在下面给出的答案就是我想要的。我基本上只是想要与在 Java 中相同的方式,例如在 for 循环中增加一个变量,以便保留该值。谢谢。

标签: prolog variable-assignment


【解决方案1】:

如果我们想要保留一个值或想要继续更改 那个变量?

  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).

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

阅读这些:

【讨论】:

    【解决方案2】:

    是的,我们可以这么说,但结果会是

    fail.
    

    失败,因为0 is 0+20 is 2 相同,无法保持。

    如果我们想以某种方式记录程序中知识改进的进展,我们可以使用编号变量作为一种选择:

    Sum1 is 0, Sum2 is Sum1 + 2.
    

    因此我们可以使用这两个值——前一个值和当前值。

    另一种选择是维护已记录更改的列表,其中列表中的每个元素都是前一个元素的下一个版本。

    在这方面,Prolog 非常类似于 functional programming(*),例如Haskell 等,迫使我们本质上以SSA 风格显式编程,或状态传递。

    (*) 在那里搜索“如何“思考功能”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多