1

我想翻译像X = a(b(c(d)))in这样的表达式[a, b, c, d]

我想我必须迭代/递归运算符=..,但我不知道如何。我试过

flatten([], []).
flatten(Exp, X) :- Exp=..[H,T], flatten(T, Y), X is append([H], Y). 

但它似乎不起作用。

有人能帮我吗?

4

1 回答 1

3

flatten /2 通常是内置的,而is /2 引入了算术评估。因此,您的 Prolog 应该警告您代码中的这些问题。

如果您将表达式限制为一元项,则应简化代码(注意我重命名了过程):

flatterm(Exp, [H|R]) :-
    Exp =.. [H, T],
    !, flatterm(T, R).
flatterm(T, [T]).

测试:

?- flatterm(a(b(c(d))),X).
X = [a, b, c, d].

您应该尝试理解为什么我交换了基本/递归案例,以及!(也称为cut)的角色。

于 2012-09-21T21:27:56.190 回答