我在 Common Lisp 中有这个问题。我需要操纵存在变量,引入 skolemization 规则。
例如,我需要构建一个函数,它会
(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-"))
。
如果发生更难的(第二种)情况并且存在一个通用量词“超出”存在性量词,那么存在的事物依赖于普遍量化的变量,这意味着函数必须处理这种依赖性并且通用变量被合并到常数,如示例中所示:
(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 并且存在,则该函数执行我上面解释的操作。