【问题标题】:What is the meaning of predicate "simple/1" in Prolog (SWI-Prolog)Prolog(SWI-Prolog)中谓词“simple / 1”的含义是什么
【发布时间】:2012-01-28 04:20:26
【问题描述】:

我在看书时遇到了问题。 我看到一个程序使用谓词“简单”(我猜是 simple/1 )。不知道这个谓词是什么意思,在控制台用?-help(simple)找不到。 但是当我在控制台中尝试一些查询时,它的工作方式类似于:

5 ?- simple(p(x)).
false.

6 ?- simple(mia).
true.

7 ?- simple(Mia).
true.

8 ?- simple(f(Mia)).
false.

我猜这是确定参数是术语(或变量)还是复杂术语的某种谓词。

【问题讨论】:

    标签: prolog predicates iso-prolog


    【解决方案1】:

    swi-prolog manual 的定义如下:

    simple(@Term) 是semidet 术语是原子的或变量。

    定义在 quintus prolog 兼容库中;在quintus prolog documentation 中的定义是:

    简单(+术语)

    Term 当前被实例化为一个原子、一个数字、一个数据库 或变量。

    无论如何,如果参数是一个简单的术语,simple/1 为真(不确定 quintus 手册中数据库的含义;我猜可能是 ODBC 连接的处理程序)

    【讨论】:

      【解决方案2】:

      翻译成 ISO 谓词:

      simple(T) :- var(T) ; atomic(T).
      

      var/1 它是最基本的元编程设备,因为如果不实例化变量,就不可能对任何子句进行谓词(即执行代码、绑定变量),即很多时候是我们感兴趣的重要部分。

      【讨论】:

      • 一般来说 - 像simple/1 这样的定义并不是很有帮助,因为它将两个级别的测试合并到一个谓词中。
      • @false:你的意思是析取引入了一个无用的选择点?我不知道“测试级别”是什么......
      • 当您编写显式依赖于参数实例化的谓词时,最好将实例化var(X)nonvar(X) 的测试与其他测试分开。特别是,明确处理这两种情况是个好主意。否则,很难对谓词进行推理。 simple/1 混合了两个级别。而且,顺便说一句。 atom/1integer/1 等也这样做。但是,如果您之前进行过var/nonvar 测试,它们的问题就会更少。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      相关资源
      最近更新 更多