あなたが正しく観察しているように、最も一般的なクエリが提起されたときに解決策がまったくないと誤って言っているため、is_list/1
は不健全、またはむしろ不完全です。
?- is_list(Ls)。
間違い。
リストが存在しませんか? 来て!
この不幸な特性はatom/1
、integer/1
などのようなすべての遺伝的型チェック述語に共通しており、提案された意味論に正しく反対する人々を「純粋主義者」とラベル付けした後、これらの述語が考案されたときに、その誤りがすでに明らかでした (当時、述語には単語がそれ以来獲得した補完的な文字)。
次のような場合:
?- is_list(Ls)、Ls = []。
間違い。
?- Ls = [], is_list(Ls).
Ls = []。
このような非単調テストを使用して、論理的な観点から何かが根本的に壊れていることを明確に示します。(,)/2
コードの最初の場所で非論理的な述語を使用する場合、「プロローグは論理結合ではありません」。それ以外の場合(,)/2
は、常に目標の論理積です。
クリーンで論理的に正しい方法は、まだ判断できない場合にインスタンス化エラーをスローすることです。
library(error)
特にmust_be/2
、継承された非論理的な述語の誤りが Prolog のカジュアルなユーザーにとっても耐え難いものになった後、健全な方向に進みます。
?- must_be(リスト、X)。
引数が十分にインスタンス化されていません
?- must_be(リスト、[_|_])。
引数が十分にインスタンス化されていません
?- must_be(リスト、[a、b、c])。
真実。
must_be/2
は使いやすく、より正確なロジック プログラムへの第一歩として最適です。他の構造も地平線上に現れています。他の人が現在の状態についてコメントしてくれることを願っています.
さて、実際の言い回しについて: 上で概説した基本的な問題はさておき、SWI の文書でほのめかされている論争は、用語をリストと見なすには最も外側のファンクターをチェックするだけで十分かどうか、またはリストが実際に次の帰納的な定義に準拠しなければならないかどうかです。次のようなリスト:
- アトム
[]
はリストです。
Ls
がリストの場合、'.'(_, Ls)
はリストです。
SWI の最近のバージョンで[]
は、 はアトムでさえないため、この概念を破ることに注意してください。