首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换lisp中的元素

替换lisp中的元素
EN

Stack Overflow用户
提问于 2013-02-11 00:26:20
回答 1查看 401关注 0票数 2

我在Common Lisp中遇到了这个问题。我需要操纵引入skolemization规则的存在变量。

例如,我需要构建一个在(p sk00042)中转换(exist ?x (p ?x))的函数。

sk00042是一个变量。请注意,当涉及到通用变量时,此函数会变得有点困难。

例如,给定表达式(forall ?y (exist ?x (p ?x ?y))的函数会将其转换为(forall ?y (p (sf666 ?y) ?y)。这个想法是,存在的变量告诉我,有满足公式的东西。如果这个存在量词是outer,那么这个量词不依赖于任何东西,并且上面第一个例子中的变量?x应该替换为常量skoo42,它是由这个函数生成的:(defun skolem-variable () (gentemp "SV-"))

(forall ?y (exist ?x (p ?x ?y)) -> (forall ?y (p (sf666 ?y) ?y)也有这个功能:

代码语言:javascript
复制
(defun skolem-function* (&rest args) (cons (gentemp "SF-") args))
(defun skolem-function (args) (apply #'skolem-function* args))

下面是一些可以让你更熟悉这个概念的例子:

代码语言:javascript
复制
(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-variableskolem-function ),它在给定一个表达式的情况下控制外部变量是否存在,然后用skolem-variable替换变量。如果外部是一个forall,后面跟着and exist,这个函数会做我上面解释过的事情。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-11 03:13:27

我刚刚浏览了维基百科上关于skolem范式的文章,但如果我没有弄错,每个存在词都会变成一个skolem函数调用,并将绑定的共性作为参数(如果作用域中没有共性,则为一个skolem常量)。一种简单的方法是在递归遍历表达式树时拥有一个绑定的通用堆栈:

代码语言:javascript
复制
(defun skolemize (form &optional (universals nil))
  (cond ((null form) nil)                                  ; subtree done
        ((consp (car form))                                ; walk branches
         (cons (skolemize (car form) universals)
               (skolemize (cdr form) universals)))
        ((eq (car form) 'forall)                           ; universal binding
         (list 'forall
               (cadr form)
               (skolemize (caddr form)                     ; skolemize body
                          (cons (cadr form) universals)))) ; new var on the stack
        ((eq (car form) 'exist)                            ; existential binding
         (subst (if universals                             ; substitute variables
                    (cons (gentemp "SF-") universals)      ; with skolem function
                    (gentemp "SV-"))                       ; with skolem constant
                (cadr form)
                (skolemize (caddr form) universals)))
        (t (cons (car form) (skolemize (cdr form) universals)))))

请注意,这只是一个开始-我没有深入研究这个主题,也没有真正测试或优化性能或优雅。此外,它将接受格式错误的输入,例如(skolemize '(forall (foo bar)))

您的示例:

代码语言:javascript
复制
CL-USER> (skolemize '(exist ?x (p ?x)))
(P SV-16)
CL-USER> (skolemize '(forall ?y (exist ?x (p ?x ?y))))
(FORALL ?Y (P (SF-17 ?Y) ?Y))
CL-USER> (skolemize '(exist ?y (forall ?x (p ?x ?y))))
(FORALL ?X (P ?X SV-18))
CL-USER> (skolemize '(exist ?y (and (p ?x) (f ?y))))
(AND (P ?X) (F SV-19))
CL-USER> (skolemize '(forall ?x (exist ?y (and (p ?x) (f ?y)))))
(FORALL ?X (AND (P ?X) (F (SF-20 ?X))))

测试更复杂的表达式:

代码语言:javascript
复制
CL-USER> (skolemize '(exist ?a
                      (forall ?b
                       (exist ?c
                        (forall ?d
                         (exist ?e (and (or (and (f ?a) (g ?b))
                                            (and (f ?c) (g ?d)))
                                        (or (and (f ?c) (g ?e))
                                            (and (f ?d) (g ?e))))))))))
(FORALL ?B
  (FORALL ?D (AND (OR (AND (F SV-15) (G ?B))
                      (AND (F (SF-16 ?B)) (G ?D)))
                  (OR (AND (F (SF-16 ?B)) (G (SF-17 ?D ?B)))
                      (AND (F ?D) (G (SF-17 ?D ?B)))))))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14799832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档