n-Queens - 逻辑错误 - 确定垂直威胁

n-Queens - Logic Error - determining a vertical threat

在这个程序中,我将确定放置皇后是否会对棋盘造成威胁。这将使用位置 1 - 8(可以展开)作为行和列。如果一列中没有棋子,则该行的 y 将为 0(否则为相应的 y)。空板如下:((1 0)(2 0)(3 0)(4 0)(5 0)(6 0)(7 0)(8 0))

我编写了以下程序来确定给定的移动是否会导致垂直威胁:

(defun THREAT? (x y)
    (not (eq
        (cdr (nth (car x) y ))
         0
        )
    )
)

这将是我的输入:

(威胁?'(1 3)'(1 0)(2 4)(3 7)(4 3)(5 2)(6 8)(7 5)(8 1))

我的想法是,我抓住第一个参数的汽车(我正在检查的 x 值),使用它来访问第二个列表中的正确元素,并找到该元素的 cdr,它将给我它的 y 值。然后我检查它是否为 0,如果它不为 0,那么它将是一个威胁。 我还没有添加检查水平和对角线的功能,所以我怀疑我可以通过条件或 if 语句轻松实现这一点,但我想在继续之前解决我对此的理解问题

我的错误如下:

*** - EVAL:2 不是函数名;尝试改用符号

非常感谢任何帮助!


修复该错误后,我发现我的程序将始终 return 为真。当输入 '(1 3) '((1 0)...) 它将 return 为真,尽管 (1 0) 的 0 应该发现它等于 0,return为真,然后否定真,因此 return 为假,但我的程序将始终 return 为真。

编辑:修复了之前的错误消息

错误信息来自第三个参数(2 4),这是正确的,因为2不是函数名。

Lisp 在将所有参数传递给函数之前对其求值。在 (2 4) 的情况下,它搜索名为 2 的函数但失败了。其余未引用的参数也会发生同样的情况。

您的 threat? 函数只需要两个参数,所以我想,这应该类似于

(threat? '(1 3) '((1 0) (2 4) (3 7) (4 3) (5 2) (6 8) (7 5) (8 1)))

要看为什么(threat? '(1 3) '((1 0) (2 4) (3 7) (4 3) (5 2) (6 8) (7 5) (8 1))) returns为真,必须要看nth

的定义

Note that the elements are numbered from zero, not one.

所以,(nth 1 '((1 0) (2 4) (3 7) ...)) returns (2 4)(我们又来了 :-) 而不是 (1 0).