使用kanren库解决斑马问题(zebra puzzles)

Kanren逻辑推理库介绍

kanren库能够起到按照指定的表达式寻找满足表达式的值,下面将介绍常用的kanren函数及其常用用法

  • eq(u,v)创建一个等式约束,表示变量a等于变量b,通常只是表达一个等式关系,返回值类型为一个逻辑表达式(函数)
  • var()用于创建逻辑变量,可以绑定到其他逻辑变量或常量。
  • run(n,x,*goals)函数用于进行逻辑推理,返回指定个满足约束的变量绑定,返回值类型为python列表,列表的每个元素是字典.
    函数参数列表中n表示返回个数,x表示想要得到的逻辑变量,*goals指的是约束条件,约束条件可以有多个.
    示例如下
x = var()
print(run(1, x, eq(x, 3)))
"""
(3,)

"""
  • membero(x,coll)函数用于判断某个元素是否属于一个列表或者另一个集合.参数列表中x表示逻辑变量,membero()函数返回值类型为布尔类型
  • conde(*goalseqs)函数用于提供逻辑与和逻辑或的操作,conde((A, B, C), (D, E))表示(A and B and C) or (D and E).
    返回对象为生成器对象,conde()函数一般作为其他函数参数存在,用以表明逻辑关系.
    示例如下
def grandParent(x,z):
    y = var()
    return conde((parent(x, y),parent(y,z)))
    #表示与关系,x为y的父母且y为z的父母
 
#定义一个关系   
parent = Relation()
#建立事实库
facts(parent, ("Ada", "Bart"),
      ("Ada", "Lisa"),
      ("Abe", "Ada"))
 
print(run(2, x, parent("Ada", x)))
print(run(1, x, grandParent(x, "Bart")))
  • lall(*goals)lany(*lany)函数用于进行约束条件的添加,lall参数中的条件必须全部满足,lany参数中的条件部分满足,返回一个新的、作为一个整体的约束条件,最终在作为推理的约束条件而存在。

解决斑马问题

问题如下

5 个人
不同国家(英国、西班牙、日本、意大利、挪威)
工作各不相同(油漆工、摄影师、外交官、小提琴家、医生)
每个人住的房子的颜色不同(红色、白色、蓝色、黄色、绿色)
每个人都有自己养的不同宠物(狗、蜗牛、斑马、马、狐狸)
喜欢喝不同的饮料(矿泉水、牛奶、茶、橘子汁、咖啡)
请按如下提示进行推理:

  1. 英国人住在红色的房子里
  2. 西班牙人养了一条狗
  3. 日本人是一个油漆工
  4. 意大利人喜欢喝茶
  5. 挪威人住在左边的第一个房子里
  6. 绿房子在白房子的右边
  7. 摄影师养了一只蜗牛
  8. 外交官住在黄房子里
  9. 中间那个房子的人喜欢喝牛奶
  10. 喜欢喝咖啡的人住在绿房子里
  11. 挪威人住在蓝色的房子旁边
  12. 小提琴家喜欢喝橘子汁
  13. 养狐狸的人所住的房子与医生的房子相邻
  14. 养马的人所住的房子与外交官的房子相邻
    根据以上提示,你能告诉我哪所房子里的人养斑马,哪所房子里的人喜欢喝矿泉水吗?

解决思路

定义推理体,负责定义逻辑变量,添加规则,进行推理即可
添加辅助限制调价,左相邻、右相邻、相邻

def left(x,y,units):
#这里使用units,units[1:]能够巧妙地返回相邻关系((1,2),(2,3),(3,4),(4,5))
    groups = zip(units,units[1:])
    return membero((x,y),groups)</
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Zebra Crossing解析maxicode码的示例代码: ``` import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; import com.google.zxing.MultiFormatReader; import com.google.zxing.ReaderException; import com.google.zxing.Result; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.maxicode.MaxiCodeReader; import com.google.zxing.maxicode.decoder.DecodedBitStreamParser; import com.google.zxing.qrcode.QRCodeReader; import java.awt.image.BufferedImage; import java.util.EnumMap; import java.util.Map; import javax.imageio.ImageIO; public class MaxiCodeDecoder { public static void main(String[] args) { try { BufferedImage image = ImageIO.read(MaxiCodeDecoder.class.getClassLoader().getResourceAsStream("maxicode.png")); BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image))); Map<DecodeHintType, Object> hints = new EnumMap<>(DecodeHintType.class); hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); hints.put(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.MAXICODE); MaxiCodeReader reader = new MaxiCodeReader(); Result result = reader.decode(binaryBitmap, hints); if (result != null) { System.out.println(DecodedBitStreamParser.decode(result.getRawBytes(), result.getResultMetadata()).getText()); } } catch (Exception e) { e.printStackTrace(); } } } ``` 在这个示例中,我们使用`ImageIO.read()`方法从文件加载maxicode图像。然后,我们创建一个`BinaryBitmap`对象,并使用`HybridBinarizer`将其转换为黑白二值图像。接下来,我们设置解码提示,其中我们指定只尝试解码maxicode码。然后,我们使用`MaxiCodeReader`类的`decode()`方法解码图像,并将结果存储在`Result`对象中。最后,我们将结果传递给`DecodedBitStreamParser`类的`decode()`方法,以获取解码后的文本。如果解码成功,我们将打印出文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值