mini -Kanren, core.logic, clojure :Reasoned Scheme, упражнение 60

Это НЕ домашнее задание --, решение уже есть в тексте. Я просто не понял решения.

Проблема

(run* (q)
  (let [a (== true q)
        b (== false q)]
    b))

Правильное решение

(false)

Мое предполагаемое решение

()

Мое замешательство

Очевидно, что строка «a (== true q )» НЕ выполняется, так как целью является только b. Это меня смущает. До сих пор моя ментальная модель логического программирования была:

  • рассмотреть все возможные присваивания q
  • выводить те, которым удается пройти через всю программу

    Таким образом, «a (== true q )» заставляет q = true, что делает невозможным выполнение строки «b (== false q )».

    Однако, по-видимому, выполняются только «вещи, необходимые для вычисления цели». Что происходит? Какова правильная модель умственного исполнения для core.logic/mini -kanren?

Спасибо

(Кстати, я явно не прав, так как mini-karen + core.logic согласуются друг с другом --Я просто хочу понять, что я делаю не так.)

7
задан Michel Schinz 19 March 2014 в 12:16
поделиться