9

プロローグのパイプ演算子は、1つ以上のアトミックヘッドとテールリストを返します。

?- [a,b,c] = [a,b|[c]].
true.

1回の一致で複数のパイプをネストするには、次のように実行できます。

?- [a,b,c] = [a|[b|[c]]].
true.

ステートメントは[a|b|c]a、b、cについて何を推測しますか?

編集

これまでのところ、私が推測できるのは次のとおりです。

?- [a,b,c] = [a|b|c].
false.

私は、この境界線の役に立たない質問に答えるよりも、答えを見つけるためのテクニックに興味があります。

EDIT2
私は明らかにプロローグにあまり精通していません、簡単な割り当てが私の質問に答えました...

?- R = [a|b|c].
R = [a| (b'|'c)].

正確には何が起こっているの(b'|'c)ですか?

4

3 に答える 3

10

私はあなたの講師ですので、これが私の答えです。
(ああ、これは宿題ではなく、模擬試験に関連していることを確認できます)。

構文[a|b|c]は実際には標準のPrologではないようであり、一部の実装では解釈が異なります。(私がこれを知っていたら、私はそれを使用しなかったかもしれません。)

と解釈する人もい[a|[b|c]]ます。(私が意図したように。)

しかし、SWIプロローグ(そしておそらく他のもの)では:

?- [a|b|c] = [a|[b|c]].
false.

(b '|' c)、実際にはリストでは'|'なくを使用して作成されます。'.'したがって、2番目|は、リストの作成の一部としてはまったく解釈されません。

これを確認するために、以下が成功します。

   ?-X =(b | c)、[a | b | c] = [a|X]。
   X =(b'|' c)。

ここ'|'は、と同じような用語の別の二項演算子のよう'.'です。

[a|b|c]Prologの標準の代わりにを使用すること[a,b|c]です。

[a|b|c]プログラミングパラダイムで使用することにしたのは、F#の表記に直接関連しているためa::b::cです。また、Prologを少しだけ見ただけです。将来的には、関連し[a|[b|c]][a,b|c]略語として使用する予定です。)

于 2010-06-04T03:24:11.880 に答える
5

ISO-Prolog内では、[a|b|c]構文が無効です。その間、SWI内でも。古いバージョンを使用したようです。いくつかのPrologシステムはこの用語にいくつかの解釈を与えました。悲しいかな、彼らはすべて、その用語をどのように解釈したかという非常に正確な方法で異なっていました。いくつかの[(a'|'b)|c]または[a|(b'|'c)]または[a|(b;c)]...まあ、あなたはそれを取得します。

これに関連するのは、中置演算子としてのバーの使用です('|')/2

ISO / IEC 13211-1:1995 / Cor.2:2012、Technical Corrigendum 2、2012-02-15で公開され|、中置演算子としてのバーの使用が正確に定義されるようになりました。それ以前は、|引用する必要がありました。これがそのドラフトです。

現在、'|'中置演算子として定義できますが、優先度は1000を超えます。このようにすると[a|b|c]、構文的に無効なままであるというあいまいなケースが残りますが|、DCGおよびCHRの使用は有効です。

構文を試して学習したい場合は、とを使用するのが最適writeq/1ですwrite_canonical/1

ISO-Prolog構文で最も適合しているシステムはGNUPrologです。

于 2013-01-31T13:23:53.817 に答える
5

aこれはステートメントではなく、用語であり、、、bまたはについては何も意味しませんc。不適切なリストを作成するだけです。

詳述すると、[|]構文は実際には.()演算子の構文糖衣です。リストは内部で作成され'.'(a,[])ますが、すぐに入力するのは非常に面倒なので、[a]代わりに書き込むことができます。したがって、.演算子はモノとリストを取得してから、より長いリストを作成することになっていますが、入力がないため、2つのアトムまたはその他のペアに適用することを妨げるものはありません。その結果、一部のリスト操作が成功し、他の操作が失敗する構造になります。これは便利な場合がありますが(バイナリツリーを考えてください)、リストほど一般的ではないため、特別な読み取り構文はありません。

(Lispの演算子でもほとんど同じことが起こりconsます。「不適切なリスト」をグーグルで検索すると、Lispについてさらに多くの結果が得られる可能性がありますが、原則はまったく同じです。)

于 2010-06-03T15:14:40.733 に答える