1

次の構造の Prolog ファイルがあります。

% LIBRARY SECTION %

foo(X) :- bar(X);
          baz(X).

% USER DATA SECTION %

% e.g. bar(charlie).

ファイルのユーザー データは、ユーザーが拡張できるように意図されていますが、デフォルトでは何も含まれていません。ただし、とが定義されていないため、これによりクエリfoo(X).が失敗します。bar/1baz/1

それらをプレースホルダー値 (つまりbar(none).) で定義しようとしましたが、ユーザー データがファイルの末尾に追加されると、GNU Prolog は不連続な述語について文句を言います。

bar/1andのダミー/プレースホルダー バージョンを定義して失敗せず、 and を含む他の行をファイルの末尾に追加できるようにする別の方法はbaz/1ありfoo(X).ますbarbaz?

4

1 に答える 1

3

私が質問を理解していれば、次のようなものが必要です。

ask_bar :-
    % ユーザー入力を取得
    assertz(バー(入力))。

フー(X) :-
    バー (X)。

これが実際に問題である場合は、次の 2 つのオプションがあります。

bar/1最初の 1 つ:動的述語として宣言します。

:- dynamic(bar/1).

(これはディレクティブです:-。行頭に the を入力するだけです。)

2 つ目: プログラムでは、 への参照の前に、次のようbar/1に述語を呼び出しますretractall/1

主要 :-
    引き込み(バー(_))、
    %....

barこれにより、すべての がデータベースから削除されとして宣言bar/1されdynamicます。

于 2015-07-17T07:41:07.767 に答える