【发布时间】:2020-09-14 17:54:01
【问题描述】:
这个引起了我对理论的兴趣:
是否可以编写一个不一致的 Prolog 程序,即一个程序根据查询的方式同时回答 false 和 true,只使用纯 Prolog,cut和false?
例如,可以查询p(1),Prolog 处理器会说false。但是当查询p(X) 时,Prolog 处理器会给出一组答案1、2、3。
这可以通过“计算状态检查谓词”轻松实现,例如var/1(最好称为fresh/1)+ el cut:
p(X) :- nonvar(X),!,member(X,[2,3]).
p(X) :- member(X,[1,2,3]).
然后
?- p(1).
false.
?- p(X).
X = 1 ;
X = 2 ;
X = 3.
如果这是高保证软件,就会出现“哎哟时间”。自然地,任何命令式程序在其他所有行上都会像这样脱轨。
所以。没有那些“计算状态检查谓词”能做到吗?
附言
上面说明了Prolog的所有谓词实际上都带有一个“计算状态”的线程隐藏参数:
p(X,StateIn,StateOut).
可以用来解释var/1和朋友们的行为。当 Prolog 程序只调用既不咨询也不修改 State 的谓词时,它就是“纯”的。好吧,至少这似乎是了解正在发生的事情的好方法。我想。
【问题讨论】:
标签: prolog