4

Я работал через 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?

ответ

6

Как упоминалось на основной вики-странице, на которой вы ссылаетесь, conde является номером TRS condi. Разница заключается в том, что TRS conde пытается упорядочить порядок, а condi чередует результирующие потоки. Таким образом, версия core.logic будет отображать все результаты, отображаемые в TRS, но между ними она вернет другие результаты, которые miniKanren никогда не обходится.

Один из подходящих шаблонов в вашем более длинном ответе состоит в том, что если вы берете каждый второй результат, начиная с (()), эта подпоследовательность результата seq выглядит как весь результат seq с (), добавленным к каждому отдельному результату. Это связано с чередованием - в этой подпоследовательности в качестве первого элемента результата выбирается (), затем lolo рекурсивно производит остальные.

 Смежные вопросы

  • Нет связанных вопросов^_^