woman(mia).
事実としてそれを主張するためにファイルを入力する必要があります。インタプリタに書き込むと、ファクトではなくクエリとして扱われます。
SWIプロローグFAQから:
トップレベルで入力する用語はクエリとして処理されますが、Prologにロードされるファイルに表示される用語は一連のルールとファクトとして処理されます。テキストが以下のようになっている場合、これはルールです。
carnivore(X) :- animal(X), eats_meat(X).
これをトップレベルで入力しようとすると、以下のエラーが発生します。なんで?ルールは用語であるため:-(Head、Body)であり、トップレベルは用語をクエリとして解釈するためです。名前:-と2つの引数を持つ述語はありません。
?- carnivore(X) :- animal(X), eats_meat(X). ERROR: Undefined
procedure: (:-)/2 ERROR: Rules must be loaded from a file ERROR:
See FAQ at http://www.swi-prolog.org/FAQ/ToplevelMode.txt
これはバカじゃないですか?うーん、ダメ。eats_meat(rataplan)という用語があるとします。これがファイルに表示されている場合は、ラタプランが肉を食べるという事実を示しています。トップレベルに表示される場合は、ラタプランが肉を食べるかどうかを証明するようにPrologに要求します。
テキストが
:- use_module(library(clpfd)).
これはディレクティブです。ディレクティブはクエリに似ていますが、トップレベルに何かをするように要求する代わりに、コンパイラに何かをするように要求します。ルールや事実のように、そのような用語はファイルに属します。
ファイルに書き込む代わりにassert
、トップレベルで使用することもできます(FAQで後述します)。