1

「スタック」と呼ばれるリスト構造があります。

問題を引き起こしている私のプログラムの時点で、これはスタックが保持するものです:

   stack([[s]],[np,[noun,john]])

これは、トレースを実行して取得したもので、スタックが保持しているものです。

これに一致するはずの次のルールを書くとき。

if
    buffer([[Word|_]])
    and aux(Word)
    and stack([s],[np,[noun, john]])

これを行うと、ルールは想定どおりに実行されます。ただし、「and stack([[s]],[np,[noun,john]])」を使用する代わりに、ここで変数を使用する必要があります。ただし、他のものを使用しようとすると、ルールが起動しません。理由がわかりません。リストで変数を使用すると、他のルールは正常に機能します。

私はもう試した

stack([s]|Foo)
stack([s]|[Foo])
stack([MyHead]|[MyTail]... and literally every other combination I can think of.

何がこの問題を引き起こしているのか完全にはわかりません

4

1 に答える 1

3

スタックには、各引数がリストであるアリティ 2 があるようです。

これらはリストの有効な構文ではありません

stack([s]|Foo)
stack([s]|[Foo])
...

しかし、一部の Prolog では (|)/2 演算子を (;)/2 の代わりに (つまり、論理和) 宣言しているため、構文エラーは表示されません。

問題を理解するために、統合演算子 (=)/2 を使用して統合を試みることができます

?- stack(S, Foo) = stack([[s]],[np,[noun,john]]).

あなたが得る

S = [[s]]
Foo = [np,[noun,john]]
于 2013-09-24T12:58:05.427 に答える