のような表現を翻訳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).
しかし、うまくいかないようです。
誰かが私を助けることができますか?
のような表現を翻訳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).
しかし、うまくいかないようです。
誰かが私を助けることができますか?
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].
ベース/再帰ケースを交換した理由と、(カット!
とも呼ばれる)の役割を理解しようとする必要があります。