Я работал через The Reasoned Schemer (TRS) с использованием Clojure.logic и обратил внимание на differences documented here. Я достиг кадра 24 главы 3, где сообщает ТРС, чтоClojure.logic difference with The Reasoned Schemer
(run 5 [x]
(lolo '((a b) (c d) . x)))
должен производить
'(()
(())
(()())
(()()())
(()()()())
Теперь я реализовал `Лоло, как
(defn lolo
"Succeeds if l is a list-of-lists."
[l]
(conde
((emptyo l) s#)
((fresh [a]
(firsto l a)
(listo a)) (fresh [d]
(resto l d)
(lolo d)))
(s# u#)))
которая производит следующие странные результаты:
'(()
(())
((_0))
(()())
((_0 _1)))
, что в основном означает, что мое лоло производит решения, которые вытесняют свежие переменные. Если я продолжаю идти, пытаясь увидеть рисунок, я получаю
'(()
(())
((_0))
(()())
((_0 _1))
(() (_0)
((_0)())
(()()())
((_0 _1 _2)))
, но я не могу достаточно увидеть достаточно ясно через туман, и был бы признателен за любой свет пролил на это. Это ошибка в моем лоло? Это ошибка в clojure.logic? Разве это разумная разница между решателем в TRS и решателем в clojure.logic? Как я могу интерпретировать или использовать результаты? Как я могу мысленно предсказать результаты clojure.logic?