展平嵌套表达式

时间:2012-09-21 20:46:55

标签: prolog

我想在X = a(b(c(d)))中翻译[a, b, c, d]等表达式。

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

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

但它似乎不起作用。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分: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)的角色。