succ未在pred上删除

时间:2018-08-22 16:16:48

标签: list haskell prolog replicate successor-arithmetics

/* 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(s(0)))))))

你们能帮我吗?

1 个答案:

答案 0 :(得分:2)

这是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 中,没有任何表达式在用作参数之前会被求值;取而代之的是,有些术语会被自动引用,并且总是按原样使用 作为谓词的参数。