我正在尝试使用clojure.core.logic来解决Smullyan的模拟模拟鸟的第一个难题,不是因为它特别难,而是作为练习。这个谜题说明有一个花园有三种颜色的花:红色,黄色和蓝色。每种颜色至少存在一次,无论你选择哪三种花,其中都会有红色和黄色。问题:第三个必然是蓝色的吗? 逻辑代码的基本框架非常简单:
(run 5 [flowers]
(counto flowers 3)
(containso flowers [:red :yellow])
(fresh [garden]
(containso garden [:red :yellow :blue])
(containso garden flowers)
(forall [flower-selection] (...))))
counto
和containso
是手动实施的,并做了显而易见的事情。我是新手,因此可能存在我缺少的现有库支持。重要的一行是以forall
开头的行。 forall
基本上是我希望存在的,但似乎无法找到。我所知道的唯一可以进入这个地方的构造是fresh
。但fresh
基本上执行存在量化∃。我想要的是普遍量化∀。
我对花园不感兴趣可能选择三种含有红色和黄色的花朵。我对一个必然导致这种选择的花园感兴趣。
答案 0 :(得分:1)
即使有一个forall,这种方法也不会真正起作用,因为花园可能是任意大的,并且测试来自无限花园的三种花的所有组合将花费无限的时间。
即使你做了 ,你仍然没有完成,因为你只证明存在一个满足这个属性的花园:你还没有证明全部符合初始条件的花园也满足了酒店的需求。
core.logic是“只是”一种建模搜索问题的方法,可以很容易地删除不感兴趣的搜索空间子树。如果您试图证明关于无限搜索空间的通用陈述,则需要以某种方式修剪以限制搜索空间的最大大小。我没有在core.logic中看到任何明显的方法来解决这个问题,而不是更多地考虑原始问题,这当然会直接导致解决方案,而根本不需要core.logic。