3

我只想将处理 lisp 查询的功能添加到 OnLisp 文本中的初始 Prolog 实现中。由于此功能在以下章节(新实现)中介绍,因此我只是从新实现中复制并进行了一些修改。

这是我修改/添加的函数/宏。

(=defun prove-query (expr binds)
    (case (car expr)
      (and (prove-and (cdr expr) binds))
      (or (prove-or (cdr expr) binds))
      (not (prove-not (cadr expr) binds))
          (lisp (gen-lisp (cadr expr) binds)) ;;; added
      (t (prove-simple expr binds))))

(defmacro with-binds (binds expr)
  `(let ,(mapcar #'(lambda (v) `(,v (fullbind ,v ,binds)))
         (vars-in expr))
     (eval ,expr)))             ;;; copied the whole macro from new implementaion and modified this line.

(=defun gen-lisp (expr binds)  ;;; copied from new implementation but modified
  (if (with-binds binds expr)
       (=values binds)
     (fail)))

但是当我运行下面的代码时,它抱怨没有定义一个变量。

(<- (ordered (?x)))

(<- (ordered (?x ?y . ?ys))
    (lisp (<= ?x ?y))
    (ordered (?y . ?ys)))

(with-inference (ordered (1 3 6))
  (print t))

*** - EVAL: variable ?G3159 has no value
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead of ?G3159.
STORE-VALUE    :R2      Input a new value for ?G3159.
ABORT          :R3      Abort main loop

我跟踪了 =gen-lisp 并扩展了宏“with-binds”,但没有发现任何有趣的东西。

(macroexpand '(with-binds '((?G3161 6) (?G3160 . 3) (?G3159 . 1)) '(<= ?G3160 ?G3159)))

(LET
 ((?G3160 (FULLBIND ?G3160 '((?G3161 6) (?G3160 . 3) (?G3159 . 1))))
  (?G3159 (FULLBIND ?G3159 '((?G3161 6) (?G3160 . 3) (?G3159 . 1)))))
 (EVAL '(<= ?G3160 ?G3159))) ;

有什么想法吗?

顺便说一下,这是完整的代码

https://drive.google.com/file/d/0B7t_DLbSmjMNRVh5SDBXdUVheDg/view?usp=sharing

提前致谢。

4

1 回答 1

4

(eval form)formnull lexical environment中求值,这意味着?G3160and?G3159没有绑定在调用中。事实上,符号在编译期间被解析,并且在运行时不再有关于词法绑定的信息。我提到了编译,但即使你在解释器中运行你的代码,lexical-symbol-value在运行时给定一个符号,你也没有可用的函数来解析绑定。

好消息是您不需要将表单包装eval在您的情况下。困难在于with-binds引入了另一个级别的引用(expr被引用)。这是我的写作方式gen-lisp

(=defun gen-lisp (expr binds)
  `(let ,(mapcar #'(lambda (v) `(,v (fullbind ,v ,binds)))
         (vars-in expr))
     (if ,expr
         (=values binds)
         (fail))))
于 2015-10-30T14:23:22.153 回答