if-statement - Prolog 中正确的流程控制,无需使用非声明式 if-then-else 语法

标签 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) 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/

相关文章:

java - java中用于流程控制的 boolean 逻辑运算符

IF 语句上的 jQuery CSS 更改

c - If语句和顺序执行

Javascript 绑定(bind)模糊,执行 'if indexOf' 和 'else'

macos - Prolog错误的编译?

c++ - 为什么 "constructor-way"允许在 "for-loop"中声明变量,但不允许在 "if-statement"中声明变量?

Prolog 在限定时间内找到所有解决方案

optimization - Prolog:优化解谜器

linux - 从 bash 脚本设置串口流量控制线?