【问题标题】:succ not getting removed on predsucc 没有在 pred 上被删除
【发布时间】:2018-08-22 16:16:48
【问题描述】:
/* Define a Prolog predicate replicate/3 which corresponds to
 * the Haskell function of the same name, except that the numeric
 * argument is expressed symbolically.
 *
 * For example, replicate(s(s(s(0))),a,[a,a,a]) should be satisfied.
 */

到目前为止,我已经找到了这个解决方案:

replicate(0,_,[]).
replicate(X,Y,[Y|Z]) :- replicate(p(X),Y,Z).

但问题是 s(s(s(0))) 没有被 pred 函数减少。结果是 p(p(p(s(s(s(0))))))

你们能帮帮我吗?

【问题讨论】:

  • Prolog 不会这样评估。请改用replicate(s(X), Y, [Y|Z]) :- replicate(X, Y, Z).
  • 哦,好吧,成功了!非常感谢@DanielLyons
  • 没问题。 :) 请注意 Prolog,它的评估方案与 Haskell 等其他语言非常不同。 :)
  • @Will:haskell 标签真的合适吗?
  • @false OP 引用了 Haskell 库函数,作为参考。

标签: list haskell prolog replicate successor-arithmetics


【解决方案1】:

这是 Haskell 的 replicate 使用(已弃用)n+k 模式编码:

replicate 0 _ = []
replicate (n+1) a = a : x where x = replicate n a

这直接对应Prolog的定义:

replicate(0, _, []).
replicate(s(N), A, [A | X]) :- replicate(N, A, X).

我们只是将结果移动到参数列表中,并使其成为谓词的最后一个参数:

    x = replicate n a    ----->     replicate(N, A, X).

模式匹配是一样的。不同的是,Prolog 不是面向表达式的语言。没有表达式在被用作下一个 function call 中的参数之前被评估;相反,有些术语总是被自动引用,按原样用作谓词的参数。

【讨论】:

  • ... 还有一点不同的是,replicate(N, s(0), [A,B]) 决定了N AB
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 2020-05-12
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多