微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Prolog 中保留值

如何解决在 Prolog 中保留值

我们可以说:

Sum is 0.
Sum is Sum + 2.

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

解决方法

如果我们希望保留某个值或希望继续更改 那个变量?

  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),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,quux(Data).
Data = f(X,g(_16532)),Y = g(_16532).

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

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

阅读这些内容:

,

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

fail.

失败,因为 0 is 0+20 is 2 相同,无法成立。

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

Sum1 is 0,Sum2 is Sum1 + 2.

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

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

在这方面,Prolog 与 functional programming(*) 非常相似,例如Haskell 等,迫使我们本质上显式地以 SSA 样式或状态传递进行编程。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?