1

のような表現を翻訳X = a(b(c(d)))したい[a, b, c, d]

operator を反復/再帰する必要があると思います=..が、方法がわかりません。私は試した

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].

ベース/再帰ケースを交換した理由と、(カット!とも呼ばれる)の役割を理解しようとする必要があります。

于 2012-09-21T21:27:56.190 に答える