1
/* 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))))))

你们能帮帮我吗?

4

1 回答 1

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 不是面向表达式的语言。没有表达式在被用作下一个函数 调用中的参数之前被评估;相反,有些术语是自动引用的,总是按原样用作predicates的参数。

于 2018-08-22T23:51:39.587 回答