我想检查一个任意的事实,如果它在知识库中,我想做一些事情,如果它不在知识库中,我想做一些其他的事情,但是没有( 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 ).发布于 2016-03-19 15:08:36
没有答案,但评论太长了。
根据定义,“流控制”不是声明性的。在运行时更改谓词数据库(已定义的规则和事实)也不是声明性的:它将状态引入到程序中。
你真的应该仔细考虑你的“数据”是否属于数据库,或者你是否可以将它保留为一种数据结构。但是你的问题没有提供足够的细节来提供任何建议。
但是,您可以看到this example of finding paths through a maze。在此解决方案中,数据库包含不会更改的有关问题的信息。搜索本身使用最简单的数据结构,即列表。如果你想称之为“流控制”,这是隐含的:它只是Prolog寻找证据的副作用。更重要的是,您可以争论程序及其功能,而无需考虑确切的控制流(但您确实要考虑Prolog的解析策略)。
发布于 2016-03-19 15:04:48
这个需求的基本问题是它是非单调的
在添加了这样一个事实之后,没有这个事实的东西可能会突然不能保持。
这本质上与单调性的重要和可取的声明属性背道而驰。
声明地说,通过添加事实,我们期望获得最多的增加,而不是保持不变的东西的减少。
因此,您的需求内在地链接到非单调结构,如if-then-else、!/0和setof/3。
对此进行推理的一种说明性方法是完全避免对知识库的属性进行检查。相反,专注于对持有的事物的清晰描述,使用Prolog子句对知识进行编码。
在你的例子中,看起来你需要对一些搜索问题的状态进行推理。解决这类任务的一种声明性方法是将状态表示为Prolog项,并编写涉及状态的纯单调规则。
例如,假设如果我们探索以前没有探索过的某个位置S0,则状态Pos与状态S相关:
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术语的显式关系进行编码。纯净,单调,并且在各个方向上都有效。
https://stackoverflow.com/questions/36097420
复制相似问题