私は Common Lisp でこの問題を抱えています。スコーレム化のルールを導入して、存在変数を操作する必要があります。
たとえば、 を有効にする関数を作成する必要があり
(exist ?x (p ?x))
ます(p sk00042)
。
sk00042
変数です。ユニバーサル変数が含まれている場合、この関数は少し難しくなることに注意してください。
たとえば、式を与えられた関数(forall ?y (exist ?x (p ?x ?y))
はそれを に変換し(forall ?y (p (sf666 ?y) ?y)
ます。アイデアは、存在変数が、式を満たす何かがあることを教えてくれるというものです。この存在量指定子が外部である場合、この量指定子は何にも依存せず、上記の最初の例の変数は、この関数によって生成される
?x
定数に置き換えられる必要があります。skoo42
(defun skolem-variable () (gentemp "SV-"))
より困難な (2 番目の) ケースが発生し、存在量指定子の「外」に普遍量化子がある場合、その存在するものは、普遍的に量化された変数に依存します。つまり、関数はこの依存関係を処理する必要があり、普遍変数は変数に組み込まれます。例のような定数:
(forall ?y (exist ?x (p ?x ?y))
->(forall ?y (p (sf666 ?y) ?y)
これは次の機能も果たします。
(defun skolem-function* (&rest args) (cons (gentemp "SF-") args))
(defun skolem-function (args) (apply #'skolem-function* args))
アイデアをよりよく理解するためのいくつかの例を次に示します。
(skolemize '(forall ?y (exist ?x (p ?x ?y))))
;=> (forall ?y (P (SF-1 ?Y) ?Y))
(skolemize '(exist ?y (forall ?x (p ?x ?y))))
;=> (for all ?x (P ?X SV-2)
(skolemize '(exist ?y (and (p ?x) (f ?y))))
;=> (AND (P ?X) (F SV-4))
(skolemize '(forall ?x (exist ?y (and (p ?x) (f ?y)))))
;=> (forall ?x (AND (P ?X) (F (SF-5 ?X)))
外部が存在するかどうかを制御する式を指定して、変数を skolem-variable に置き換える関数を (skolem-variable
および上記を使用して) 作成する必要があります。skolem-function
外側が forall であり、その後に存在する場合、関数は上で説明したことを実行します。