アンサー セット プログラミングに関して、ナレッジ ベースに既定のステートメントが既に (また) 存在する場合に、既存のファクトを無効にする方法について質問があります。
たとえば、2 人の人がいseby
てandy
、そのうちの 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).
よろしくお願いします。