在lisp中切换案例

时间:2013-02-10 04:08:09

标签: lisp

我有一个函数应该转换为cnf中的wff,该函数的一部分不想工作,我设法查明问题,这里是代码

(defun skole-gay (fbf &optional (var-for nil) (var-ex nil))
(if (consp fbf)
    (case (car fbf)
        (forall ;nel caso di forall salvo il prossimo elemento assieme a possibile altri elementi di altri forall
            (skole-gay (third fbf) (cons (second fbf) var-for) var-ex))
        (exist  ;nel caso di exist salvo il suo elemento 
            (skole-gay (third fbf) var-for (cons (second fbf) var-ex)))
        ((car var-ex)   ;nel caso che trovo l'elemento salvato della exist faccio dei contrllo per vedere cosa devo fare
            (cond
                ((eql (car var-for) nil)    ;se sub-for e' vuoto vuol dire che non ci sn stati forall indi devo solo inserire la const
                    (cons (skolem-variable)
                    (skole-gay (cdr fbf) nil var-ex))) ;dopo la costante metter il resto della fbf
                ((not(eql (car var-for) nil))   ;ci sono stati forall
                    (cons (skolem-function var-for)
                    (cons (car var-for) (skole-gay (cdr fbf) nil var-ex))))))
        ((and or) ;se trovo and or not semplicemente li riscrivo e continuo con la ricorsione
            (list (car fbf) (skole-gay (second fbf) var-for var-ex) (skole-gay (third fbf) var-for var-ex)))
        ((not) ;se trovo and or not semplicemente li riscrivo e continuo con la ricorsione
            (list (car fbf) (skole-gay (second fbf) var-for var-ex)))

        (otherwise
        ;; e' solo 1 proposizione, la ritorno
            fbf))
fbf))

在某一点上我做(case(car fbf); fbf =?x的车 其中一个案例是((car var-ex);在那个程序中,程序也是?x 但它确实运行了该程序的那部分,我不知道为什么,

忽略代码中的注释,因为它们是意大利语

1 个答案:

答案 0 :(得分:3)

case形式的子句必须在编译时可用。这些子句不会被评估,并且将完全按照在代码中编写的方式使用。

在您的示例中,该子句指定(car var-ex),它是两个符号的列表:carvar-ex。如果值是其中任何一个,则将调用该子句。我怀疑情况是否如此,这就是为什么它似乎被忽略了。