7

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)
| ?- 

一方、ファイルに書き込んでファイルを参照して実行すると、正常に機能しているようです...

後でそれらを参照する必要があるファイルでのみ述語を定義することは許可されていますか?エディター自体でそれを行うことはできませんか?

4

2 に答える 2

12

repl で述語を作成するのは少し面倒です。あなたができる

| ?- ['user'].
woman(mia).
^D

つまり、ユーザー入力を調べる、または

| ?- assertz(woman(mia)).

それを主張します。どちらも厄介なIMOです-もっと良い方法があるかもしれませんが、私はそれを知りません. 一般に、スクリプトを使用する方が簡単です。

于 2011-09-06T18:50:59.010 に答える
8

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で後述します)。

于 2011-09-06T18:52:21.730 に答える