質問

私はPrologに新しいですが、私はこのおそらく単純なコマンドで立ち往生しています。私はロードしました エラーのない知識ベース、そして私がやろうとするたびに アサート (とさえ 助けて!)私は 次のメッセージを取得します:

uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}

私は正確に何が欠けていますか?感謝します。

役に立ちましたか?

解決

使用 assertz/1 または asserta/1 代わりに。GNU-Prologは提供していません assert/1 なぜなら、唯一の asserta/1assertz/1 標準で定義されています。

注意してほしいのは、 asserta/1 常に一つの明確な解釈の意味を持っていた 最初に句を追加します, 、の意味 assertz/1 「最後に句を追加する」は、句をアサートする前に呼び出された目標のセマンティクスを完全には決定しないため、解決がより困難でした。

ISO-Prologでは、以前に呼び出された目標 assertz/1 (しかしまた retract/1)は影響を受けないままです。これはとして知られています 論理更新ビュー.標準を引用するには(ISO/IEC13211-1:1995):

7.5.4論理データベースの更新

の結果として発生するデータベースの変更
目標を実行する(例えば、aの活性化剤が
subgoalはの呼び出しです assertz/1 または retract/1)に影響を与えるものとします
その後に実行が開始されるアクティベーションのみ。ザ-
変更は、現在のアクティベーションには影響しません
実行されています。

注-したがって、データベースはの実行中に凍結されます
目標、およびpredicationを定義する句のリストは、次のように固定されています
その実行の瞬間(7.7.7eを参照)。

DECsystem10Prologでは、マニュアルは次の間に大きな違いを作ったことに注意してください assert/1assertz/1.1978年のDECsystem10ユーザーガイドからの次の引用では、この用語は次のようになっています。 実装定義 標準では次のように知られているものだけを意味することができます 実装依存 (本質的に未定義を意味する)。

5.5メタ論理

...

assert(C)

の現在のインスタンス C 句として解釈され、追加されます
現在の解釈されたプログラムに(新しいプライベート変数を使用して)
uninstantiated変数を置き換える)。新しいの位置
関連するプロシージャ内の句は実装定義です。
C 非変数にインスタンス化する必要があります。

asserta(C)

のように assert(C), ただし、新しい句が最初の句になることを除いて
関連する手順のための句。

assertz(C)

のように assert(C), 、新しい句が最後になることを除いて
関連する手順のための句。

また、今日のシステムがあります assert/1assertz/1 違います。例:, .

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top