我想检查一个任意事实,并在知识库中进行某些操作,如果不是,则进行其他操作,但是没有( 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 ).
最佳答案
没有答案,但评论太久。
根据定义,“流控制”不是声明性的。在运行时更改谓词数据库(定义的规则和事实)也不是声明性的:它将状态引入程序。
如果您的“数据”属于数据库,或者可以保留它的数据结构,则应该认真考虑。但是您的问题没有提供足够的细节来提出任何建议。
但是,您可以看到this example of finding paths through a maze。在此解决方案中,数据库包含有关不变的问题的信息。搜索本身使用最简单的数据结构,即列表。如果要调用它,则“流控制”是隐式的:这只是Prolog寻找证明的副作用。更重要的是,您可以在不考虑确切控制流程的情况下就程序及其功能进行辩论(但您确实要考虑Prolog的解决策略)。