1. ホーム
  2. prolog

[解決済み] Prologは初めてです。このコードを実行しようとすると、 - ERROR: Undefined procedure: teaches/2 (DWIM could not correct goal) が表示されます。

2022-02-18 15:03:24

質問

以下は、私が書いた事実です。

instructor(ahmed,mohammed, cs101,01).
instructor(sara,salah,cs101,02).
instructor(maryam,faisal,cs101,03).
instructor(ali,hassan,cs311,01).

enrolled(201110202,huda,issa,cs101,01).
enrolled(20110303,mona,amer,cs101,01).
enrolled(20115566,amal,omar,cs101,01).
enrolled(20118899,ahmed,hassan,cs101,01).

ルール

teaches(D,S):-
   instructor(D,_,C,Z),
   enrolled(S,_,_,C,Z).

classmate(s1,s2,C):-
  enrolled(s1,_,_,C,Z),
   enrolled(s2,_,_,C,Z).

しかし、idがstdを教える人というクエリを実行すると 20110303 というエラーが表示されます。私はあらゆる種類のエラーをチェックしました。構文的にも論理的にも正しいのですが、それでも未定義手続きと表示されます。

?- debug.
   true.

[debug]  ?-  teaches(D,20110303).
ERROR: Undefined procedure: teaches/2 (DWIM could not correct goal)

解決方法は?

エラーの発生

SWI-PROLOGを使用している場合、同じエラーが発生します。 editor でファクトとルールを入力し、その後に Prolog interpreter はクエリを実行します。

ERROR: Undefined procedure: teaches/2 (DWIM could not correct goal)

相談しながらロード

これでファクトとルールが

C:/Users/Eric/Documents/Prolog/soQuestion_4.pl

で、インタープリターで consult

?- consult("C:/Users/Eric/Documents/Prolog/soQuestion_4.pl").

そして、クエリを実行します。

?- teaches(D,20110303).

正しい結果を得ることができます。

D = ahmed ;
false.

リストを使用する

述語が読み込まれているかどうかを確認する一つの方法として listing .

listing を使って述語をチェックすると teaches consultで読み込む前に、私は取得します。

?- listing(teaches).
ERROR: prolog_stack([frame(12,call(system:throw/1),throw(error(existence_error(procedure,teaches),context(toplevel,'DWIM could not correct goal')))),frame(11,clause(<clause>(000000000518AD30),62),'$dwim':dwim_existence_error(error,user:teaches)),frame(8,clause(<clause>(0000000005008E40),24),prolog_listing:listing(user:teaches)),frame(7,clause(<clause>(0000000005154870),3),'$toplevel':toplevel_call(user:listing(teaches)))]): procedure `teaches' does not exist (DWIM could not correct goal)

で述語を読み込むと、その述語は

?- consult("C:/Users/Eric/Documents/Prolog/soQuestion_4.pl").
true.

という述語があることを確認し、リストで確認します。

?- listing(teaches).
teaches(A, B) :-
        instructor(A, _, C, D),
        enrolled(B, _, _, C, D).