2012-09-21 74 views
1

我想要在[a, b, c, d]中翻譯像X = a(b(c(d)))這樣的表達式。平整嵌套表達式

我想我必須迭代/遞歸運算符=..,但我不知道如何。我試過

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

但它似乎沒有工作。

有人可以幫助我嗎?

回答

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)的角色。

+0

只是一個問題:哪個是'= ..'運算符的名字? – Aslan986

+0

它有一個奇怪的名字:[univ](http://www.swi-prolog.org/pldoc/doc_for?object=%28%3D..%29/2)。我認爲是爲了像'普遍訪問'... – CapelliC

+0

@ Aslan986順便說一句通常在Prolog中謂詞包括arity,並且運算符被'('和')':'(= ..)/ 2'包圍。 – m09