エラー「ルールが安全ではありません」動作しません:。このすべての最初の環式または非環式の依存関係とは何の関係もありません同じエラーメッセージがために現れます非環状プログラム:
foo2(R, 1) :- not foo(R,_), bar(R).
問題は、プログラムが実際に安全ではないということです(http://www.dlvsystem.com/html/DLV_User_Manual.html#SAFETY)負のルール上のセクション(アンカー#AEN375で述べたように、私は唯一の私に2つのリンクを使用させていただいております。答え:
Variables, which occur in a negated literal, must also occur in a positive literal in the body.
_が匿名変数であることを確認します。すなわち、プログラム
foo(R,1) :- not foo(R,_), bar(R).
は同等として書かれた(とと等価である)ことができ
foo(R,1) :- not foo(R,X), bar(R).
匿名変数(DLVマニュアル、アンカー#のAEN264 - セクションの最後に)だけに私たちを許可しますルール内で一度しか出現しない変数の名前を作るのを避けます(つまり、ある値があり、それはまったく気にしない変数ですが、それでも変数です)。そして、否定は否定であるため、 「真の否定」(またはしばしば呼ばれる「強い否定」)ではなく、3つの安全条件のどれもが規則によって満たされていない。
非常に大まかで高レベルの安全性の直観は、プログラムのすべての変数がある有限領域に割り当てられることを保証することです。bar(R)を追加することでRになります。ただし、匿名変数_の場合も同じでなければなりません。
デフォルト値を定義する実際の問題: として指摘されているようにlambda.xy。ここで問題となるのは、DLVのAnswer Set(または安定したモデル)のセマンティクスです。あるルールでそれを実行しようとしても解決策はありません。 安全なプログラムを入手するために、上記の問題を置き換えることができます。 、意図したとおりに答えは、であると仮定{FOO(1,2)、バー(1)バー(2)、FOO(2,1)} :
foo(1,2). bar(1). bar(2).
tmp(R) :- foo(R,_).
foo(R,1) :- not tmp(R), bar(R).
によってこれが安定なモデルを持っていませんしかし、tmp(R): - foo(R、_)はtmp(2)を含む必要があるので、これは有効なモデルではありません。しかし、 "not tmp(2)"はもはや真ではなく、したがってモデルにfoo(2,1)を持つことは、モデルの必要最小限性に違反します。 (これは正確には起こっておらず、直感的ではありません。詳細な技術的な詳細については、回答セットプログラミングの記事で見つけることができます。したがって、問題を解決するためには、何らかの形で「サイクルを壊す」必要があります。一つの可能性は次のようになります。
foo(1,2). bar(1). bar(2). bar(3).
tmp(R) :- foo(R,X), X!=1.
foo(R,1) :- bar(R), not tmp(R).
すなわち、明示的に我々は値が1と異なっている場合にのみ、中間原子にRを追加することを示すことによって、モデル内のfoo(2,1)を有するTMPと矛盾しません(2)ではなく、もモデルの一部です。もちろん、これはもはやfoo(R、1)がデフォルト値または入力として存在するかどうかを区別することはできませんが、必要でない場合は...
もう一つの可能性は、代わりにいくつかのfoo1。私。
foo1(R,X) :- foo(R,X).
tmp(R) :- foo(R,_).
foo1(R,1) :- bar(R), not tmp(R).
そして、fooの代わりにfoo1を使用してください。
私はaspセマンティクスで少し錆びますが、プログラムの特殊化は '' foo(dummy、1)です: - foo(dummy、1)ではなく '' foo(dummy、1)です。拡張子に含まれていない場合は拡張子にしますか?それは私と矛盾しているようです。 –
私はaspに新しいですが、何年も前に私は他の言語と同様にプレイしました。私の最終的な目標は、foo(dummy、1)をまだ定義されていない場合に定義する方法を見つけることです。私がDLVについて知っていることからの私の印象は、「fooではない」ということは、「foo(。)が真実であるという証拠がない場合」または「他の言葉では "foo(。)は表示されません" – rutex
私は周期性と否定の問題は、空のモデル '' '{}' ''で始まり、 '' 'foo(_)' ''が成立し、モデルを '' {foo(1)} ''に拡張します。しかし、そのルールを使用する正当性は無効になります。 2段階アプローチはどうですか? '' bar(1)の行に沿って何か: - foo(_)ではなく。 bar(X): - foo(X).'''。 –