/* 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)))))))
你们能帮我吗?
答案 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 中,没有任何表达式在用作参数之前会被求值;取而代之的是,有些术语会被自动引用,并且总是按原样使用 作为谓词的参数。