If statement 在Prolog中进行适当的流控制,而不使用非声明性if-then-else语法

If statement 在Prolog中进行适当的流控制,而不使用非声明性if-then-else语法,if-statement,prolog,flow-control,logical-purity,If Statement,Prolog,Flow Control,Logical Purity,我想检查一个任意的事实,如果它在知识库中,我想做一些事情,如果它不在知识库中,我想做一些其他的事情,但是没有(I->T;E)语法 我的知识库中有一些事实: unexplored(1,1). unexplored(2,1). safe(1,1). 给定一条不完整的规则 foo:- safe(A,B), % do something if unexplored(A,B) is in the knowledge base % do something else if unexplored(A,B)

我想检查一个任意的事实,如果它在知识库中,我想做一些事情,如果它不在知识库中,我想做一些其他的事情,但是没有
(I->T;E)
语法

我的知识库中有一些事实:

unexplored(1,1).
unexplored(2,1).
safe(1,1).
给定一条不完整的规则

foo:- safe(A,B),
% do something if unexplored(A,B) is in the knowledge base
% do something else if unexplored(A,B) is not in the knowledge base
如果不这样做,正确的处理方法是什么

foo:-
   safe(A,B),
   ( unexplored(A,B) -> something ; something_else ).

这个要求的基本问题是它是非单调的:

没有这个事实的事物可能会在添加这样一个事实后突然失效

这与单调性这一重要而可取的声明性本质上是背道而驰的

声明性地说,通过添加事实,我们期望得到最多的是增加,而不是减少所持有的东西

由于这个原因,您的需求天生就与非单调结构相关联,比如if-then-else,
/0
集合/3

对此进行推理的一种声明方式是完全避免检查知识库的属性。相反,应该专注于清楚地描述所包含的内容,使用Prolog子句对知识进行编码

在您的情况下,似乎需要对某个搜索问题的状态进行推理。解决此类任务的一种声明式方法是将状态表示为Prolog项,并编写涉及状态的纯单调规则

例如,假设一个状态
S0
与状态
S
相关,如果我们探究一个之前未探究的位置
Pos

state0_state(S0, S) :-
    select(Pos-unexplored, S0, S1),
    S = [Pos-explored|S1].
或更短:

state0_state(S0, [Pos-explored|S1) :-
    select(Pos-unexplored, S0, S1).
我把在这里使用的州代表作为一个简单的练习。注意使用
S0
S1
,…,
S
链接不同状态的便捷命名约定


这样,就可以对表示状态的Prolog术语的显式关系进行编码。纯粹、单调、全方位地工作。

不是答案,但太长了,无法发表评论

根据定义,“流量控制”不是声明性的。在运行时更改谓词数据库(定义的规则和事实)也不是声明性的:它将状态引入程序

如果你的“数据”属于数据库,或者你可以保持它是一个数据结构,你应该非常仔细地考虑。但你的问题并没有提供足够的细节来提出任何建议

然而,你可以看到。在这个解决方案中,数据库包含关于问题的信息,这些信息不会改变。搜索本身使用最简单的数据结构,即列表。如果你想称之为“流控制”,这是隐含的:它只是Prolog寻找证明的副作用。更重要的是,您可以在不考虑确切控制流的情况下讨论程序及其功能(但您确实考虑了Prolog的解析策略)