1

アンサー セット プログラミングに関して、ナレッジ ベースに既定のステートメントが既に (また) 存在する場合に、既存のファクトを無効にする方法について質問があります。

たとえば、2 人の人がいsebyandy、そのうちの 1 人が同時に運転できるとします。シナリオはseby、3 行目に見られるように運転することができますが、たとえば、彼の免許が取り消された後、彼はもう運転することができないとしましょう。したがって、4 行目から 7 行目までがあり、その間に 7 行andy目に見られるように運転を学びました。6 行目は 1 つだけを示しています。人は一度に運転することができますが、示す以外に同じではsebyありandyません。

1 person(seby).
2 person(andy).
3 drives(seby).
4 drives(seby) :- person(seby), not ab(d(drives(seby))), not -drives(seby).
5 ab(d(drives(seby))).
6 -drives(P) :- drives(P0), person(P), P0 != P.
7 drives(andy).

上記のプログラムでは、3 行目と 7 行目は 6 行目と矛盾しており、(私が使用している) Clingo ソルバーは明らかに を出力しますUNSATISFIABLE

以上のことをすべて言いましたが、行 3 を削除するとは言わないでください。そうすれば問題は解決します。この質問の背後にある意図は、Line 3 を何らかの方法で無効にして、Line 4 にその義務を果たさせることができるかどうかを知ることです。

ただし、4 行目は次のように書くこともできます。

4 drives(P) :- person(P), not ab(d(drives(P))), not -drives(P).

よろしくお願いします。

4

2 に答える 2

0

何かが真である場合、それは常に真でなければなりません。したがって、次の行:

drives(seby).

常に真になります。

ただし、事実を選択ルールに入れることでこれを回避できます。

0{drives(seby)}1.

この行は、答えが 0 から 1 になることを示していますdrives(seby).。これは、矛盾するルールを持つことができdrives(seby).、答えは依然として満足できることを意味しますが、true にすることもdrives(seby).できます。

このプログラムの両方:

0{drives(seby)}1.
drives(seby).

そして、このプログラム:

0{drives(seby)}1.
:- drives(seby).

満足です。

drives(seby).可能な場合はtrue になり、そうでない場合は false になりたいと思うでしょう。これを達成するには、可能な場合は Clingo にdrives(seby).true を強制する必要があります。これは、最適化を使用して行うことができます。

これを行う単純な方法は、drives(seby).存在する数 (0 または 1) をカウントし、カウントを最大化することです。

drives(seby).この行での数を数えることができます:

sebyCount(N) :- N = #count {drives(seby) : drives(seby)}.

drives(seby).N はドメイン内のの数と同じdrives(seby).です。これは 0 または 1 のいずれかになります。

そして、次のステートメントで N の値を最大化できます。

#maximize {N@1 : sebyCount(N)}.

これにより、sebyCount(N) の領域で優先度 1 の N の値が最大になります (数値が小さいほど、優先度は低くなります)。

于 2019-04-12T09:55:54.020 に答える