gpt4 book ai didi

lisp - 关于 Prolog 的实现

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:51 25 4
gpt4 key购买 nike

我只想将处理 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))) ;

对此有什么想法吗?

顺便说一句,这里是complete code

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

提前致谢。

最佳答案

(eval form)null 词法环境 中计算form,这意味着?G3160?G3159​​ 未在调用中绑定(bind)。实际上,符号是在编译期间解析的,并且在运行时不再有关于词法绑定(bind)的信息。我提到了编译,但即使您在解释器中运行您的代码,也不会有 lexical-symbol-value 函数可用于解析绑定(bind),在运行时给定一个符号。

好消息是,在您的情况下,您不需要将表单包装在 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))))

关于lisp - 关于 Prolog 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33437906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com