0

いくつかの事実を一度だけ主張したいのですが、まだ主張されていない場合は、次のことを確認します。

:- dynamic item/6.

init(Id, LastId, Depth) :-   
                        ruut(X,Y,Color),
                        (item(X,Y,Color,Depth,Id,LastId) -> true;       
                        assert(item(X,Y,Color,Depth,Id,LastId))),
                        fail.

init(_, _, _).

重要なのは、まだアサートされていない場合にのみアサートすることです。しかし、エラーが発生しています。

ERROR: my_pgm:initsialiseeri_seisund/3: Undefined procedure: my_pgm:item/6

私が間違っていることは何ですか?noobの質問で申し訳ありませんが、私はプロローグに本当に慣れていません!

4

1 に答える 1

0

オンラインの SWI-Prologでこのエラーを再現しようとしましたが、うまくいきました。コードのサンプルは次のとおりです。

:- dynamic foo/1.

lower(X,X).
lower(X,U):- X is U-1. % duplicate
lower(X,U):- U > 0, U1 is U-1, !, lower(X, U1).

init(U):-
  lower(X,U),
  \+(foo(X)), assert(foo(X)),
  fail; !, true.

show_all:-
  foo(X), print(X), nl, fail; !, true.

:- init(5), show_all.

たぶん、モジュールの誤用がありますか?init/6つまり、あるモジュールとassert/1別のモジュールで定義したため、問題が発生しましたか?

于 2012-12-14T16:41:23.140 に答える