hello everybody,<br>I have some trouble in solving the '<a href="http://en.wikipedia.org/wiki/Zebra_Puzzle">Zebra Puzzle</a>' using drools5.<br>I defined a class named 'House' to represent the data, and the corresponding enums as well : Color.java, Nation.java, Pet.java, Drink.java, Cigarette.java, here are those sources:<br>
<br>House.java:<br>public class House {<br><br> // 颜色<br> public Color color;<br> // 房子从左数的位置 1-5<br> public int position;<br> public Nation nation;<br> public Pet pet;<br> public Drink drink;<br> public Cigarette cigarette;<br>
......<br><br>Color.java:<br><br>public enum Color {<br> red, yellow, blue, green, ivory<br>}<br><br>Nation.java:<br><br>public enum Nation {<br> englishman, spaniard, norwegian, ukrainian, japanese<br>}<br><br>Pet.java:<br>
<br>public enum Pet {<br> dog, fox, snails, horse, zebra<br>}<br><br>Drink.java:<br><br>public enum Drink {<br> orangeJuice, tea, coffee, milk, water<br>}<br><br>Cigarette.java:<br><br>public enum Cigarette {<br> kools, chesterfields, winston, luckyStrike, parliaments<br>
}<br><br>And this is my drl file:<br><br>package com.sample<br> <br>import com.sample.fh.*<br><br>rule "英国人住在红色的房子里"<br> when<br> $h1:House(nation == Nation.englishman, color != Color.red)<br> $h2:House(color == Color.red)<br>
then<br> System.out.println("英国人(englishman)住在红色(red)的房子里");<br> modify($h2){setColor($h1.color)};<br> modify($h1){setColor(Color.red)};<br>end<br><br>rule "西班牙人养了一条狗"<br> when<br>
$h1:House(nation == Nation.spaniard)<br> $h2:House(pet == Pet.dog, nation != Nation.spaniard)<br> then<br> System.out.println("西班牙人(spaniard)养了一条狗(dog)");<br> modify($h2){setPet($h1.pet)};<br>
modify($h1){setPet(Pet.dog)};<br>end<br><br>rule "挪威人住在左边的第一个房子里"<br> when<br> $h1:House(position == 1, nation != Nation.norwegian)<br> $h2:House(nation == Nation.norwegian)<br> then<br>
System.out.println("挪威人(norwegian)住在左边的第一个房子里");<br> modify($h2){setNation($h1.nation)};<br> modify($h1){setNation(Nation.norwegian)};<br>end<br><br>rule "黄房子里的人喜欢抽kools牌的香烟"<br> when<br>
$h1:House(color == Color.yellow, cigarette != Cigarette.kools)<br> $h2:House(cigarette == Cigarette.kools)<br> then<br> System.out.println("黄房子(yellow)里的人喜欢抽kools牌的香烟");<br> modify($h2){setCigarette($h1.cigarette)};<br>
modify($h1){setCigarette(Cigarette.kools)};<br>end<br><br>rule "抽chesterfields牌香烟的人与养狐狸的人是邻居"<br> when<br> $h1:House(cigarette == Cigarette.chesterfields, pet != Pet.fox)<br> $h2:House(pet == Pet.fox)<br>
$h3:House(eval(position - $h2.position == 1) || eval(position - $h2.position == -1))<br> eval($h1.position - $h2.position != 1 && $h1.position - $h2.position != -1)<br> then<br> System.out.println("抽chesterfields牌香烟的人与养狐狸(fox)的人是邻居");<br>
int tmp = $h3.position;<br> modify($h3){setPosition($h1.position)};<br> modify($h1){setPosition(tmp)};<br>end<br>rule "抽chesterfields牌香烟的人与养狐狸的人是同一人"<br> when<br> $h1:House(cigarette == Cigarette.chesterfields, pet == Pet.fox)<br>
$h2:House(eval(position - $h1.position == 1) || eval(position - $h1.position == -1))<br> then<br> System.out.println("抽chesterfields牌香烟的人与养狐狸的人是同一人");<br> modify($h1){setPet($h2.pet)};<br>
modify($h2){setPet(Pet.fox)};<br>end<br><br>rule "挪威人住在蓝色的房子旁边"<br> when<br> $h1:House(nation == Nation.norwegian)<br> $h2:House(color == Color.blue)<br> $h3:House(eval(position - $h2.position == 1) || eval(position - $h2.position == -1))<br>
eval($h1.position - $h2.position != 1 && $h1.position - $h2.position != -1)<br> then<br> System.out.println("挪威人(norwegian)住在蓝色(blue)的房子旁边");<br> modify($h1){setNation($h3.nation)};<br>
modify($h3){setNation(Nation.norwegian)};<br>end<br><br>rule "抽winston牌香烟的人养了一只蜗牛"<br> when<br> $h1:House(cigarette == Cigarette.winston)<br> $h2:House(pet == Pet.snails, cigarette != Cigarette.winston)<br>
then<br> System.out.println("抽winston牌香烟的人养了一只蜗牛(Snails)");<br> modify($h2){setPet($h1.pet)};<br> modify($h1){setPet(Pet.snails)};<br>end<br><br>rule "抽LuckyStrike牌香烟的人喜欢喝桔子汁"<br>
when<br> $h1:House(cigarette == Cigarette.luckyStrike)<br> $h2:House(drink == Drink.orangeJuice, cigarette != Cigarette.luckyStrike) <br> then<br> System.out.println("抽Lucky Strike牌香烟的人喜欢喝桔子汁(orange juice)");<br>
modify($h2){setDrink($h1.drink)};<br> modify($h1){setDrink(Drink.orangeJuice)};<br>end<br><br>rule "乌克兰人喜欢喝茶"<br> when<br> $h1:House(nation == Nation.ukrainian)<br> $h2:House(drink == Drink.tea, nation != Nation.ukrainian)<br>
then<br> System.out.println("乌克兰人(ukrainian)喜欢喝茶(tea)");<br> modify($h2){setDrink($h1.drink)};<br> modify($h1){setDrink(Drink.tea)};<br>end<br><br>rule "日本人抽parliaments牌的烟"<br>
when<br> $h1:House(nation == Nation.japanese)<br> $h2:House(cigarette == Cigarette.parliaments, nation != Nation.japanese)<br> then<br> System.out.println("日本人(japanese)抽parliaments牌的烟");<br>
modify($h2){setCigarette($h1.cigarette)};<br> modify($h1){setCigarette(Cigarette.parliaments)}<br>end<br><br>rule "抽kools牌的香烟的人与养马的人是邻居"<br> when<br> $h1:House(cigarette == Cigarette.kools)<br>
$h2:House(pet == Pet.horse)<br> $h3:House(eval(position - $h2.position == 1) || eval(position - $h2.position == -1))<br> eval($h1.position - $h2.position != 1 && $h1.position - $h2.position != -1)<br>
then<br> System.out.println("抽kools牌的香烟的人与养马(horse)的人是邻居");<br> modify($h1){setCigarette($h3.cigarette)};<br> modify($h3){setCigarette(Cigarette.kools)};<br>end<br><br>rule "喜欢喝咖啡的人住在绿房子里"<br>
when<br> $h1:House(drink == Drink.coffee)<br> $h2:House(color == Color.green, drink != Drink.coffee)<br> then<br> System.out.println("喜欢喝咖啡(coffee)的人住在绿(green)房子里");<br> modify($h2){setColor($h1.color)};<br>
modify($h1){setColor(Color.green)};<br>end<br><br>rule "绿房子在象牙白房子的右边"<br> when<br> $h1:House(color == Color.green, position != 1)<br> $h2:House(color == Color.ivory, position != 5)<br> $h3:House(eval(position == $h2.position + 1), color != Color.green)<br>
then<br> System.out.println("绿(green)房子在象牙白(ivory)房子的右边(图中的右边)");<br> modify($h1){setColor($h3.color)};<br> modify($h3){setColor(Color.green)};<br>end<br>rule "白房子已经在最右边了"<br> when<br>
$h1:House(color == Color.ivory, position == 5)<br> $h2:House(color == Color.green, position != 1)<br> $h3:House(eval(position == $h2.position -1))<br> then<br> System.out.println("白房子已经在最右边了");<br>
$h3.setPosition($h1.position);<br> $h1.setPosition($h2.position - 1);<br> update($h3);<br> update($h1);<br>end<br>rule "绿房子已经在最左边了"<br> when<br> $h1:House(color == Color.green, position == 1)<br>
$h2:House(color == Color.ivory, position != 5)<br> $h3:House(eval(position == $h2.position + 1))<br> then<br> System.out.println("绿房子已经在最左边了");<br> modify($h3){setPosition($h1.position)};<br>
modify($h1){setPosition($h2.position + 1)};<br>end<br>rule "绿房子在最左边且白房子在最右边"<br> when<br> $h1:House(color == Color.green, position == 1)<br> $h2:House(color == Color.ivory, position == 5)<br>
$h3:House()<br> $h4:House(eval(position - $h3.position == 1))<br> then<br> System.out.println("绿房子在最左边且白房子在最右边");<br> modify($h2){setPosition($h3.position)};<br> modify($h3){setPosition(5)};<br>
modify($h1){setPosition($h4.position)};<br> modify($h4){setPosition(1)};<br>end<br><br>rule "中间那个房子里的人喜欢喝牛奶"<br> when<br> $h1:House(position == 3, drink != Drink.milk)<br> $h2:House(drink == Drink.milk)<br>
then<br> System.out.println("中间那个房子里的人喜欢喝牛奶");<br> modify($h2){setDrink($h1.drink))};<br> modify($h1){setDrink(Drink.milk)};<br>end<br><br>rule "output"<br> when<br> $h1:House(position == 1)<br>
$h2:House(position == 2)<br> $h3:House(position == 3)<br> $h4:House(position == 4)<br> $h5:House(position == 5)<br> <br> House(nation == Nation.englishman, color == Color.red)<br>
<br> House(nation == Nation.spaniard, pet == Pet.dog)<br> <br> House(position == 1, nation == Nation.norwegian)<br> <br> House(color == Color.yellow, cigarette == Cigarette.kools)<br>
<br> $h6:House(cigarette == Cigarette.chesterfields)<br> $h7:House(pet == Pet.fox)<br> eval($h6.position - $h7.position == 1 || $h6.position - $h7.position == -1)<br> <br> $h8:House(nation == Nation.norwegian)<br>
$h9:House(color == Color.blue)<br> eval($h8.position - $h9.position == 1 || $h8.position - $h9.position == -1)<br> <br> House(cigarette == Cigarette.winston, pet == Pet.snails)<br> <br>
House(cigarette == Cigarette.luckyStrike, drink == Drink.orangeJuice)<br> <br> House(nation == Nation.ukrainian, drink == Drink.tea)<br> <br> House(cigarette == Cigarette.parliaments, nation == Nation.japanese)<br>
<br> $h10:House(cigarette == Cigarette.kools)<br> $h11:House(pet == Pet.horse)<br> eval($h10.position - $h11.position == 1 || $h10.position - $h11.position == -1)<br> <br> House(drink == Drink.coffee, color == Color.green)<br>
<br> $h12:House(color == Color.green)<br> $h13:House(color == Color.ivory)<br> eval($h12.position - $h13.position == 1)<br> <br> House(position == 3, drink == Drink.milk)<br> then<br>
System.out.println("从左到右:");<br> System.out.println("第一间房子是"+$h1.color+"色的;住着"+$h1.nation+"人;养"+$h1.pet+"宠物;抽"+$h1.cigarette+"牌香烟;喝"+$h1.drink+"饮料;");<br>
System.out.println("第二间房子是"+$h2.color+"色的;住着"+$h2.nation+"人;养"+$h2.pet+"宠物;抽"+$h2.cigarette+"牌香烟;喝"+$h2.drink+"饮料;");<br> System.out.println("第三间房子是"+$h3.color+"色的;住着"+$h3.nation+"人;养"+$h3.pet+"宠物;抽"+$h3.cigarette+"牌香烟;喝"+$h3.drink+"饮料;");<br>
System.out.println("第四间房子是"+$h4.color+"色的;住着"+$h4.nation+"人;养"+$h4.pet+"宠物;抽"+$h4.cigarette+"牌香烟;喝"+$h4.drink+"饮料;");<br> System.out.println("第五间房子是"+$h5.color+"色的;住着"+$h5.nation+"人;养"+$h5.pet+"宠物;抽"+$h5.cigarette+"牌香烟;喝"+$h5.drink+"饮料;");<br>
end<br> <br>There's some unicode character in the file.But it shouldn't bother the compilation>...<<br>The rule named 'output' describes when the computation should stop. The other rules are absorbed from the original 'Zebra puzzle' problem and each making a little change to the working memory in order to 'approach' the solution...(I don't know if I'm doing this wrong..)<br>
<br>No matter how I modify this program, it always result in an infinite loop...<br>For example, the console prints these messages repeatedly:<br><br>白房子已经在最右边了<br>抽chesterfields牌香烟的人与养狐狸的人是同一人<br>抽kools牌的香烟的人与养马(horse)的人是邻居<br>
黄房子(yellow)里的人喜欢抽kools牌的香烟<br>抽kools牌的香烟的人与养马(horse)的人是邻居<br>黄房子(yellow)里的人喜欢抽kools牌的香烟<br>抽kools牌的香烟的人与养马(horse)的人是邻居<br>黄房子(yellow)里的人喜欢抽kools牌的香烟<br>抽kools牌的香烟的人与养马(horse)的人是邻居<br>黄房子(yellow)里的人喜欢抽kools牌的香烟<br>抽kools牌的香烟的人与养马(horse)的人是邻居<br>
黄房子(yellow)里的人喜欢抽kools牌的香烟<br>......................<br><br>I worked quite much time on this problem till now, and I referenced another solution which is programmed in prolog, but still I didn't figured out the drools solution to this problem.<br>
Could somebody give a hint? Any help is appreciated,<br>Thanks!<br clear="all"><br>-- <br>Regards.<br>Miles. Wen<br><br>