clojure.core.logic中是否有一个“逻辑适用于所有人”选项?

clojure.core.logic中是否有一个“逻辑适用于所有人”选项?,clojure,logic-programming,clojure-core.logic,Clojure,Logic Programming,Clojure Core.logic,我试图解决Smullyan中的第一个难题,即使用clojure.core.logic模拟一只知更鸟,这不是因为它特别难,而是作为一种练习。拼图上说有一个花园有三种颜色的花:红色、黄色和蓝色。每种颜色至少出现一次,无论你采哪三种花,其中都会有一朵红色和一朵黄色的。问题:第三个一定是蓝色的吗? 逻辑代码的基本框架非常简单: (run 5 [flowers] (counto flowers 3) (containso flowers [:red :yellow]) (fresh [g

我试图解决Smullyan中的第一个难题,即使用clojure.core.logic模拟一只知更鸟,这不是因为它特别难,而是作为一种练习。拼图上说有一个花园有三种颜色的花:红色、黄色和蓝色。每种颜色至少出现一次,无论你采哪三种花,其中都会有一朵红色和一朵黄色的。问题:第三个一定是蓝色的吗?
逻辑代码的基本框架非常简单:

(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
基本上就是我希望存在的东西,但似乎找不到。我所知道的唯一可以在这里使用的构造是
fresh
。但是
fresh
本质上执行存在量化∃. 我想要的是通用量化∀.

我对一个花园不感兴趣,因为它可以选择三种花,一种是红色的,一种是黄色的。我感兴趣的是一个必然会导致这样一种选择的花园。

即使有一个花坛,这种方法也不会真正起作用,因为花园可能是任意大的,而要测试一个无限花园中三种花的所有组合将需要无限长的时间

即使你这样做了,你仍然不会这样做,因为你只证明了存在一个满足这个属性的花园:你没有证明所有满足初始条件的花园也满足这个属性


logic“只是”一种建模搜索问题的方法,它可以很容易地修剪搜索空间中无趣的子树。如果您试图证明一个关于无限搜索空间的通用语句,则需要以某种方式进行删减,以限制搜索空间的最大大小。我看不出在这个问题的core.logic中有任何明显的方法可以做到这一点,除非对原始问题进行更多的思考,这当然会直接导致解决方案,而根本不需要core.logic。

all
?也许-在这里找到-(也许不是)你读过“模仿一只知更鸟”吗?我很好奇你是否会推荐这个;另外,如果有类似的书,我很乐意听到你可能愿意分享的任何建议。当然,雷蒙德·斯穆利安的任何一本书都有助于理解逻辑思维,特别是TMaM有一个关于函数式编程基础的长长的章节。我想我从来没有读完过他的一本书:谜题对我来说太难了。不过,我不认为它们与逻辑编程特别相关。此外,在我主持的一个随机生成的益智游戏(不是我写的),基于“女士或老虎”中的益智,我邀请你尝试。太好了,谢谢你的信息,我会尝试你建议的益智!也许可以在core.logic中实现Prolog的谓词,但我还没有看到它的实现。