首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >剪辑中的八个皇后之谜

剪辑中的八个皇后之谜
EN

Stack Overflow用户
提问于 2015-06-13 03:55:08
回答 1查看 207关注 0票数 0

我正在尝试用CLIPS开发一个解决八个皇后问题(https://en.wikipedia.org/wiki/Eight_queens_puzzle)的解算器,但我是这门语言的新手。首先,我试图制定一条规则来验证新的断言,比较以前的断言的列/行。当插入重复行时,它可以工作,但是当插入重复列时,它不会检测到它。这段代码有什么问题?

代码语言:javascript
复制
(defrule verificaAssercaoDamas ; verifica se atende as regras
   ?novaPosicao <- (d ?line ?column) 
   ?posicao <- (d ?line2 ?column2)
   (test (neq ?posicao ?novaPosicao))
   (test (or (eq ?line2 ?line) (eq ?column column2))  )
   =>
   (retract ?novaPosicao)
   (if (< (+ ?column 1) 9)
       then (assert (d ?line (+ ?column 1) ))
)
CLIPS> (assert(d 0 0))
<Fact-1>
CLIPS> (assert(d 1 0))
<Fact-2>
CLIPS> (assert(d 0 1))
<Fact-3>
CLIPS> (agenda)
0       cerificaAssercaoDamas: f-3, f-1
0       cerificaAssercaoDamas: f-1, f-3
For a total of 2 activations.
CLIPS>
EN

回答 1

Stack Overflow用户

发布于 2015-06-13 07:05:12

您正在使用表达式(eq ?column column2),该表达式将变量? column2与符号列进行比较。您需要将它与变量?column2 2进行比较。

代码语言:javascript
复制
CLIPS> (clear)
CLIPS> 
(defrule verificaAssercaoDamas 
   ?novaPosicao <- (d ?line ?column) 
   ?posicao <- (d ?line2 ?column2)
   (test (neq ?posicao ?novaPosicao))
   (test (or (eq ?line2 ?line) (eq ?column ?column2)))
   =>
   (retract ?novaPosicao)
   (if (< (+ ?column 1) 9)
       then (assert (d ?line (+ ?column 1)))))
CLIPS> (assert (d 0 0))
<Fact-1>
CLIPS> (assert (d 1 0))
<Fact-2>
CLIPS> (assert (d 0 1))
<Fact-3>
CLIPS> (agenda)
0      verificaAssercaoDamas: f-3,f-1
0      verificaAssercaoDamas: f-1,f-3
0      verificaAssercaoDamas: f-2,f-1
0      verificaAssercaoDamas: f-1,f-2
For a total of 4 activations.
CLIPS> 

如果你正在测试数字的相等性/不等性,你应该使用=和!= (或<>)函数,因为它们会为非数字参数抛出错误:

代码语言:javascript
复制
CLIPS> (clear)
CLIPS> 
(defrule verificaAssercaoDamas 
   ?novaPosicao <- (d ?line ?column) 
   ?posicao <- (d ?line2 ?column2)
   (test (neq ?posicao ?novaPosicao))
   (test (or (= ?line2 ?line) (= ?column column2)))
   =>
   (retract ?novaPosicao)
   (if (< (+ ?column 1) 9)
       then (assert (d ?line (+ ?column 1)))))
[ARGACCES5] Function = expected argument #2 to be of type integer or float

ERROR:
(defrule MAIN::verificaAssercaoDamas
   ?novaPosicao <- (d ?line ?column)
   ?posicao <- (d ?line2 ?column2)
   (test (neq ?posicao ?novaPosicao))
   (test (or (= ?line2 ?line) (= ?column column2)
CLIPS> 

您也可以通过检查?novaPosicao的事实索引大于?posicao的事实索引来删除重复的激活:

代码语言:javascript
复制
CLIPS> (clear)
CLIPS> 
(defrule verificaAssercaoDamas 
   ?novaPosicao <- (d ?line ?column) 
   ?posicao <- (d ?line2 ?column2)
   (test (< (fact-index ?posicao) (fact-index ?novaPosicao)))
   (test (or (= ?line2 ?line) (= ?column ?column2)))
   =>
   (retract ?novaPosicao)
   (if (< (+ ?column 1) 9)
       then (assert (d ?line (+ ?column 1)))))
CLIPS> (assert (d 0 0))
<Fact-1>
CLIPS> (assert (d 1 0))
<Fact-2>
CLIPS> (assert (d 0 1))
<Fact-3>
CLIPS> (agenda)
0      verificaAssercaoDamas: f-3,f-1
0      verificaAssercaoDamas: f-2,f-1
For a total of 2 activations.
CLIPS> 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30811184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档