我正在尝试使用 clojure.core.logic 解决 Smullyan 的 To Mock a Mockingbird 中的第一个难题,不是因为它特别难,而是作为一种练习。谜题说有一个花园,有三种颜色的花:红色、黄色和蓝色。每种颜色至少出现一次,无论您采摘哪三朵花,其中都会有一朵红色和一朵黄色。问题:第三个一定是蓝色的吗?
逻辑代码的基本骨架非常简单:
(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
本质上执行存在量化∃。我在这里想要的是全称量化∀。
我对可以选择包含红色和黄色的三朵花的花园不感兴趣。我对一个必然导致这种选择的花园感兴趣。