0

のようなリストに要素のリストが[1,2,+]あり、それらを 1 つの要素としてスタックにプッシュしたいと考えています。角かっこの間に入れることでそれを行うことができますが、これにより出力に角かっこが表示されます。たとえば、リスト [1,2,+] の要素をスタックにプッシュしたいとします。

stack([1,2,+],S,Y).

どこstackにある:

stack(T,S,[T|S]).

問題は、より多くの式をスタックにプッシュすると、ネストされたブラケットが作成されることです。たとえば、 を取得しますが[[+,1,2],[*,3,4]]、 が必要です[+,1,2,*,3,4]。どうすればこれを達成できますか?

4

3 に答える 3

2

リストを「平坦化」できます:

| ?- List = [[+,1,2],[*,3,4]], flatten(List, FlatList).

List = [[+,1,2],[*,3,4]]
FlatList = [+,1,2,*,3,4]

Prolog インタープリターには、フラット化された述語を持つリスト ライブラリが含まれていることがよくありますが、ここに (SWI-Prolog のリスト ライブラリからの) 1 つの実装を示します。

flatten(List, FlatList) :-
flatten(List, [], FlatList0), !,
FlatList = FlatList0.

flatten(Var, Tl, [Var|Tl]) :-
  var(Var), !.
flatten([], Tl, Tl) :- !.
flatten([Hd|Tl], Tail, List) :- !,
  flatten(Hd, FlatHeadTail, List), 
  flatten(Tl, Tail, FlatHeadTail).
flatten(NonList, Tl, [NonList|Tl]).
于 2009-10-30T13:00:22.530 に答える
2

私はあなたの質問と全体的な目標を完全には理解していませんが、このようなものが欲しいかもしれません.

stack(el(X, Y, Z), StackTail, [X, Y, Z | StackTail]).

スタック要素がすべてトリプルの場合、それらを 3 つの要素のリストとして表現しないでください。これはスペース効率がよくありません。むしろ、用語として表現してくださいel/3

また、スタックを複雑な用語のリストにするのではなく、原子的な用語のリストにしたいということも理解しています。上記の の定義は、プッシュ時に用語stack/3を解明しel/3、ポップ時に用語を構築します。

于 2009-10-30T13:26:15.443 に答える
1

スタックにさらに 2 つのルールを追加すると、うまくいくはずです。

これは宿題のように見えるので、リストは示しませんが、最初の引数が明示的にリストであり、そのアイテムが既存のスタックに再帰的に追加される新しいルールが必要になります。

member/2とを書いたことがあればappend/2、これで問題はないはずです。

于 2009-10-30T13:48:47.863 に答える