Clips 剪辑中的农民困境

Clips 剪辑中的农民困境,clips,expert-system,Clips,Expert System,我试图解决农民的困境 关键是让农夫、狐狸、卷心菜和山羊过一条小溪。但是船上只有两样东西。如果让山羊独自一人,狐狸会吃掉它。如果让卷心菜独自一人,山羊会吃掉它 为此,我主要只能使用函数模板和规则来解决它 假设农夫、狐狸、山羊和卷心菜都站在一边-1,并且想要移到一边1 首先我制作了状态模板 (deftemplate state (slot farmer) (slot fox) (slot goat) (slot cab)) 我定义了一个函数来进行移动 (deffunction move(

我试图解决农民的困境

关键是让农夫、狐狸、卷心菜和山羊过一条小溪。但是船上只有两样东西。如果让山羊独自一人,狐狸会吃掉它。如果让卷心菜独自一人,山羊会吃掉它

为此,我主要只能使用函数模板和规则来解决它 假设农夫、狐狸、山羊和卷心菜都站在一边-1,并且想要移到一边1 首先我制作了状态模板

 (deftemplate state
(slot farmer)
(slot fox)
(slot goat)
(slot cab))
我定义了一个函数来进行移动

    (deffunction move(?f ?x ?g ?c)
(if (and (neq ?f 1) (or (and (eq ?f ?g) 
(and(neq ?f ?x) (neq ?f ?c)))
(or (and (neq ?f ?c) (and(eq ?f ?x) (eq ?f ?g))) 
(and (eq ?f ?c) (and(eq ?f ?x) (eq ?f ?g))))))
   then 
(bind ?f (* -1 ?f))
(bind ?g (* -1 ?g))
(printout t "farmer become on side" ?f "fox on side " ?x 
"goat on side " ?g "cabbage on side " ?c crlf)
   else 
(if (or (and (neq ?f ?c) (and(eq ?c ?x) (eq ?f ?g))) 
(and (neq ?f ?g) (and(eq ?f ?x) (eq ?f ?c))))
   then 
(bind ?f (* -1 ?f))
(printout t "farmer become on side" ?f "fox on side " ?x 
"goat on side " ?g "cabbage on side " ?c crlf)
   else
(if (and (neq ?f ?g) (and(eq ?f ?x) (eq ?f ?c)))
   then
(bind ?f  (* -1 ?f))
(bind ?x (* -1 ?x))
(printout t "farmer become on side" ?f "fox on side " ?x 
"goat on side " ?g "cabbage on side " ?c crlf)
   else
(if (and (neq ?f ?x) (and(eq ?f ?c) (eq ?f ?g)))
   then
(bind ?f (* -1 ?f))
(bind ?c (* -1 ?c))
(printout t "farmer become on side" ?f "fox on side " ?x 
"goat on side " ?g "cabbage on side " ?c crlf)
))))))
我还定义了规则

(defrule move-to-opp
(state (farmer ?f) (fox ?x) (goat ?g) (cab ?c))
(or (or (neq ?f 1) (neq ?g 1)) (or (neq ?x 1) (neq ?c 1)))
=>
(printout t "firstly farmer on side" ?f "fox on side " ?x 
    "goat on side " ?g "cabbage on side " ?c crlf)
(move ?f ?x ?g ?c))
(or (or (neq ?f 1) (neq ?g 1)) (or (neq ?x 1) (neq ?c 1)))
然后我将模板中的事实定义为都在第一面-1

(deffacts initial-state
(state (farmer -1) 
(fox -1) 
(goat -1) 
(cab -1)))
运行规则后,不会出现任何输出,但当我从规则中删除循环条件时,它为我迈出了第一步

(defrule move-to-opp
(state (farmer ?f) (fox ?x) (goat ?g) (cab ?c))
(or (or (neq ?f 1) (neq ?g 1)) (or (neq ?x 1) (neq ?c 1)))
=>
(printout t "firstly farmer on side" ?f "fox on side " ?x 
    "goat on side " ?g "cabbage on side " ?c crlf)
(move ?f ?x ?g ?c))
(or (or (neq ?f 1) (neq ?g 1)) (or (neq ?x 1) (neq ?c 1)))

这是一个农民困境的实现

======================================================
;;;   农民困境问题
;;;
;;;     另一个典型的人工智能问题(食人族和
(传教士的)农业术语。关键是
;;;     为了得到农夫,狐狸,卷心菜和苹果
;;;     山羊穿过小溪。
;;;        但是船上只装了两件东西。如果留下
;;;     与山羊单独在一起,狐狸会吃掉它。如果
;;;     把卷心菜放在一边,山羊就可以吃了
;;;     信息技术
;;;        本例使用规则和事实模式
;;;     匹配来解决问题。
;;;
;;;     CLIPS版本6.0示例
;;;
;;;     要执行,只需加载、重置和运行。
;;;======================================================
(除霜主模块
(导出模板状态)
;;;*************
;;;* 模板*
;;;*************
;;; 状态事实代表状态
;;; 搜索树的信息。
(主模板::状态
(插槽搜索深度(整型)(范围1?变量))
(插槽父项(类型事实地址符号)(允许的符号无父项))
(1)农场主位置
(类型符号)(允许符号shore-1 shore-2))
(老虎机位置)
(类型符号)(允许符号shore-1 shore-2))
(插槽位置)
(类型符号)(允许符号shore-1 shore-2))
(位置)
(类型符号)(允许符号shore-1 shore-2))
(最后一步
(类型符号)(允许符号不能单独移动)
;;;*****************
;;;* 初始状态*
;;;*****************
(deffacts MAIN::初始位置
(状态(搜索深度1)
(家长无家长)
(农场主位置shore-1)
(fox位置shore-1)
(1号海岸)
(1号海岸)
(最后一步不动)
(主语)对立物
(shore-1 shore-2对面)
(与shore-2和shore-1相对)
;;;***********************
;;;* 生成路径规则*
;;;***********************
(defrule MAIN::单独移动
?节点
(重复?节点(搜索深度=(+1?个))
(父节点)
(农场主位置?ns)
(仅最后一步)
(defrule MAIN::与福克斯一起移动
?节点
(重复?节点(搜索深度=(+1?个))
(父节点)
(农场主位置?ns)
(福克斯位置?ns)
(最后一步)
(defrule MAIN::与山羊一起移动
?节点
(重复?节点(搜索深度=(+1?个))
(父节点)
(农场主位置?ns)
(山羊位置?ns)
(最后一步)
(deframe MAIN::用卷心菜移动
?节点
(重复?节点(搜索深度=(+1?个))
(父节点)
(农场主位置?ns)
(卷心菜位置?ns)
(最后一步)
;;;******************************
;;;* 违反约束规则*
;;;******************************
(d)模块约束
(导入主模板状态))
(defrule约束::狐狸吃山羊
(声明(自动对焦为真))
?节点
(收回?节点))
(defrule约束::山羊吃卷心菜
(声明(自动对焦为真))
?节点
(收回?节点))
(defrule约束::循环路径
(声明(自动对焦为真))
(状态(搜索深度?sd1)
(农场主位置?fs)
(福克斯定位?xs)
(山羊位置?gs)
(卷心菜位置(cs))
?节点
(收回?节点))
;;;*********************************
;;;* 查找并打印解决方案规则*
;;;*********************************
(d)模块解决方案
(导入主模板状态))
(deftemplate解决方案::移动
(插槽id(类型事实地址符号)(允许的符号无父项))
(多批次移动列表)
(类型符号)(允许符号不能单独移动)
(defrule解决方案::识别解决方案
(声明(自动对焦为真))
?节点
(收回?节点)
(断言(移动(id?父项)(移动列表?移动)))
(defrule解决方案::进一步的解决方案
?节点