Sicstus Prolog / Swi-Prolog Replの述語を定義します
-
27-10-2019 - |
質問
私は読んでいます http://cs.union.edu/~striegnk/learn-prolog-now/html/node3.html#subsec.l1.kb1、しかし、私は次の述語を実行するのに苦労しています:
SICStus 4.0.1 (x86-win32-nt-4): Tue May 15 21:17:49 WEST 2007
| ?- woman(mia).
! Existence error in user:woman/1
! procedure user:woman/1 does not exist
! goal: user:woman(mia)
| ?-
一方、ファイルに書き込み、ファイルを参照してください。正常に動作しているようです...
後で相談するためにファイル内の述語を定義することのみを許可されていますか?編集者自体でそれを行うことはできませんか?
解決
入力する必要があります woman(mia).
事実としてそれを主張するファイルに。通訳に書き込むと、事実ではなく、クエリとみなされます。
から SWI Prolog FAQ:
トップレベルで入力する用語はクエリとしてプロセスですが、プロログにロードされるファイルに表示される用語は、ルールと事実のセットとして処理されます。以下のようにテキストが読まれる場合、これはルールです。
carnivore(X) :- animal(X), eats_meat(X).
トップレベルでこれを入力しようとすると、以下のエラーが発生します。なんで?ルールは用語であるため:-(ヘッド、ボディ)、そしてトップレベルは用語をクエリとして解釈するためです。名前の述語はありません: - 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)という用語があるとします。これがファイルに表示される場合、ラタプランが肉を食べるという事実を述べています。 The Toplevelに表示されている場合、Rataplanが肉を食べるかどうかを証明するようにPrologに依頼します。
テキストが読み取られた場合
:- use_module(library(clpfd)).
これは指令です。ディレクティブはクエリに似ていますが、トップレベルに何かをするように頼む代わりに、コンパイラに何かをするように頼みます。ルールや事実と同様に、そのような用語はファイルに属します。
ファイルに書き込む代わりに、使用することもできます assert
トップレベルで(FAQの後半でも説明されているように)。
他のヒント
REPLで述語を作るのは少し迷惑です。あなたがすることができます
| ?- ['user'].
woman(mia).
^D
つまり、ユーザー入力を参照してください
| ?- assertz(woman(mia)).
それを主張します。どちらも厄介なIMO-より良い方法があるかもしれませんが、私はそれを知りません。一般に、スクリプトを使用する方が簡単です。