我想检查任意事实,如果它在知识库中则执行某些操作,如果不在知识库中则执行其他操作,但没有 ( 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 的解析策略)。
关于if-statement - Prolog 中正确的流程控制,无需使用非声明式 if-then-else 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36097420/