尝试编写代码,对给定问题进行有限深度优先搜索并限制..我对这种语言非常新,所以这基本上只是一些想法..别欺负我xD
(defstruct state
pos
vel
action
cost
track
other)
(defstruct problem
initial-state
fn-nextStates
fn-isGoal
fn-h);heuristic funtion
(defstruct node
parent
state)
(defun limdepthfirstsearch (problem limit)
(return (recursiveldfs make-node(problem-initial-state) problem limit )))
(defun recursiveldfs (node problem limit)
(if (problem-fn-isGoal (node-state node)) (solution(node)))
(if (= limit 0) ':corte)
(setf (cutoff_ocurred) nil)
(loop for each (possible-actions) in (problem-fn-nextstates(node-state node)) do
(setf (child) (nextState (node-state node) (possible-actions)))
(setf (result) (recursiveldfs child problem (- limit 1)))
(if (= result ':corte) (setf (cutoff_ocurred) t))
(if (!= result nil) (return result))
)
(if (= cutoff_ocurred t) '(:corte))
(if (= cutoff_ocurred nil) nil)
)
答案 0 :(得分:0)
我的第二个@ BadZen的评论,但看起来你对普通的lisp来说还是一个新手,所以我只是给你的代码提供一些指示或评论。
首先,请考虑遵循common-lisp的介绍,例如:Practical common lisp以便快速入门,甚至更好(尽管基于方案)the SICP lectures,以便更深入地了解口齿不清。
另外请提交至少编译的代码,或者询问有关您收到的错误消息的问题。您的代码无法编译。请尝试使用common-lisp标准样式,至少用“ - ”分隔名称中的多个单词。您的代码很难阅读。
致你的代码:
在limdepthfirstsearch
中,return
是不必要的。通常,lisp return
仅用于返回值并从nil命名的块中退出,例如循环或dolist等。
在同一个函数中,make-node(problem-initial-state)
语法错误(这不是lisp函数如何获取参数),此外,make-node
需要两个参数(父级和状态)。你可能想要的是:
(recursiveldfs (make-node NIL (problem-initial-state problem)) problem limit)
其中NIL
我认为是最初的问题父(无论你的结构意味着什么)。如果(problem-initial-state problem)
实际上是列表'(parent state)
,那么您需要撰写(recursiveldfs (apply #'make-node (problem-initial-state problem)) problem limit)
在recursiveldfs
的定义中,语句(problem-fn-isGoal (node-state node)
表示(node-state node)
返回problem
结构。在同一行中,(solution(node))
在语法上是错误的,代码中没有名为solution
的函数,node
也不是函数。 solution
和(node)
之间缺少空格。我无法弄清楚这里是什么意思。
再次在recursiveldfs
的定义中,您可以编写(setf (cutoff_ocurred) nil)
。由于没有名为cutoff_ocurred
的函数,我认为你的意思是(setf cutoff_ocurred nil)
,但仍然没有名为cutoff_ocurred
的变量。这是什么意思?也许您需要使用recursiveldfs
来启动(let ((cutoff_ocurred nil)) ..)
?
在下面的循环中,从(possible-actions)
(两次出现)中删除parens。这里需要一个循环发生的变量。
(probem-fn-nextstates(node-state node))
在problem-fn-nextstates
之后缺少空格,再次如(3)所示,它意味着(node-state node)
返回problem
结构。 do
进入下一行(查找一些常见的lisp样式指南)。
在do
之后,只有第一个语句属于do
,其余语句在语法错误。如果您需要do
循环中的多个语句,请使用do (progn (...) (...) ... (...))
。
child
和result
既未定义函数也未定义变量(参见4)。
什么是:corte
?
请记住这些评论时重写您的代码,并在介绍了常见的lisp(至少从gigamonkeys书的几章开始)之后,编辑您的问题或提交一个新的问题,并编译代码,以及使用示例输入,如@BadZen所示。我还建议使用:type或注释来对结构进行注释。