これは一般的なエラーです。つまり、ファクトを入力することでトップレベルに直接入力できるという一定の前提があるということです。
インタープリターは、クエリとして入力されたものを理解し、クエリの述語がまだ定義されていないため、エラーを発行します。
ただし、エンドユーザーには複数のオプションがあります。
1) 最初のオプションは assertz/1 または asserta/1 を使用します:
トップレベルは目標を実行するためのものです。インタープリターにアサートを実行するように指示するゴールが必要です。asserta/1 または assertz/1 を使用します。
トップレベル:
?- assertz(likes(foo, bar)).
すでに静的述語として使用されている述語、つまり方法 2) または 3) によって追加された述語は、それ以上アサートできないことに注意してください。次に、dynamic/1 ディレクティブを使用します。
組み込みの assert/1 は、ISO コア標準の一部ではなく、通常は assertz/1 に対して冗長であるため、サポートされていません。
2) 2 番目のオプションは、ファイルを使用して参照し
ます。ファクトとルールをファイルに配置します。そして、consult/1 ビルトインを介して参照します。
ファイル baz.p:
likes(foo, bar).
トップレベル:
?- consult('baz.p').
Consult/1 の代わりに、ensure_loaded/1 または use_module/1 を使用することもできます。
3) コンソールから直接参照する 3 番目のオプション:
トップレベルでファクトとルールを直接入力します。ファイルの終わりのキー ストロークによって、事実と規則の入力を終了します。
トップレベル:
?- [user].
likes(foo, bar).
^D
さよなら