【问题标题】:Successor function in PrologProlog 中的后继函数
【发布时间】:2014-03-18 11:46:50
【问题描述】:

在我最近在大学逻辑编程考试中遇到的一个问题中,我被要求编写一个 Prolog 谓词 odd/1 来确定给定值是否为奇数。

该实现应该使用已经给定的谓词s/1,它将评估给定元素的后继(即X + 1)。 这是为实现odd/1 谓词给出的解决方案:

odd(s(0)):-!. % 1 is the first odd number
odd(s(s(X))):- odd(X). % A number s(s(X)) (i.e X + 2) is odd if X is odd as well
  1. 第一个表达式中的! 真的有什么用吗?我知道它可以防止在此之后回溯,但是没有以下表达式?这是否意味着解析算法会在此时停止?
  2. 为了练习,我尝试实现s/1 后继谓词,但无法这样做。 (如何)可以在 Prolog 中实现这个谓词吗?

【问题讨论】:

  • 剪切 (!) 使您的定义不完整:odd(X),X=s(s(s(0))) 失败,但应该像 X=s(s(s(0))),odd(X) 一样成功

标签: prolog successor-arithmetics


【解决方案1】:

这是没有剪辑的痕迹

[trace] 21 ?- odd(s(s(s(0)))).
   Call: (6) odd(s(s(s(0))))
   Call: (7) odd(s(0))
   Exit: (7) odd(s(0))
   Exit: (6) odd(s(s(s(0))))
true ;
   Redo: (7) odd(s(0))
   Fail: (7) odd(s(0))
   Fail: (6) odd(s(s(s(0))))
false.

这里有剪辑

[trace] 22 ?- odd(s(s(s(0)))).
   Call: (6) odd(s(s(s(0))))
   Call: (7) odd(s(0))
   Exit: (7) odd(s(0))
   Exit: (6) odd(s(s(s(0))))
true.

我认为是为了提高效率而添加了删减...

关于s/1,它不是谓词,而是数据结构。也许你见过类似的东西

integer(0).
integer(s(X)) :- integer(X).

这实际上是(正)整数的无限域的最简单的递归定义

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多