2

私は恣意的な事実をチェックし、それがナレッジベースにある場合は何かを行い、そうでない場合は別のことをしたいと思いますが、( I -> T ; E)構文はありません。

私のナレッジベースにはいくつかの事実があります:

unexplored(1,1).
unexplored(2,1).
safe(1,1).

不完全なルールが与えられた

foo:- safe(A,B),
% do something if unexplored(A,B) is in the knowledge base
% do something else if unexplored(A,B) is not in the knowledge base

このようにせずに、これを処理する正しい方法は何ですか?

foo:-
   safe(A,B),
   ( unexplored(A,B) -> something ; something_else ).
4

2 に答える 2

2

答えではありませんが、コメントするには長すぎます。

「フロー制御」は定義上、宣言的ではありません。実行時に述語データベース (定義されたルールとファクト) を変更することも宣言的ではありません。つまり、プログラムに状態が導入されます。

「データ」がデータベースに属しているかどうか、またはデータ構造を維持できるかどうかを慎重に検討する必要があります。しかし、あなたの質問は、何かを提案できるほどの詳細を提供していません。

ただし、迷路を通る経路を見つけるこの例を見ることができます。このソリューションでは、データベースには変更されない問題に関する情報が含まれています。検索自体は、最も単純なデータ構造であるリストを使用します。「フロー制御」と呼びたい場合、これは暗黙的です。これは、証明を探す Prolog の単なる副作用です。さらに重要なことは、正確な制御フローを考慮しなくても、プログラムとその機能について議論できることです (ただし、Prolog の解決戦略は考慮します)。

于 2016-03-19T07:08:35.530 に答える
1

この要件の根本的な問題は、それが非単調であるということです:

この事実がなければ成り立たないことが、そのような事実を加えると突然成り立たなくなることがあります。

これは本質的に、単調性の重要かつ望ましい宣言的特性に反します。

宣言的に、事実を追加することで、保持されるものの減少はなく、せいぜい増加が得られると予想されます。

!/0このため、要件は本質的に、if-then-elseや などの非単調構造にリンクされていますsetof/3

これを推論する宣言的な方法は、ナレッジ ベースのプロパティのチェックを完全に回避することです。代わりに、 Prolog 句を使用して知識をエンコードすることで、保持するものの明確な説明に焦点を当てます。

あなたの場合、検索の問題の状態について推論する必要があるようです。このようなタスクを解決する宣言的な方法は、状態を Prolog 項として表現し、状態に関する純粋な単調規則を記述することです。

たとえば、以前は調査されていなかった特定の位置を調査する場合、状態は状態S0に関連しているとしましょう。SPos

state0_state(S0, S) :-
    select(Pos-unexplored, S0, S1),
    S = [Pos-explored|S1].

またはそれより短い:

state0_state(S0, [Pos-explored|S1) :-
    select(Pos-unexplored, S0, S1).

簡単な演習として、ここで使用している状態表現を理解することはやめておきます。S0S1、 ...を使用Sしてさまざまな状態を連鎖させる便利な命名規則に注意してください。

このようにして、状態を表す Prolog 用語に関する明示的な関係をエンコードします。純粋で単調で、あらゆる方向に作用します。

于 2016-03-19T07:04:47.507 に答える