Какой синтаксис core.logic matche, defne шаблоны соответствия шаблонов использовать?

Некоторые конструкторы core.logic(matcha, matche, matchu, defne, fne) используют выражения соответствия шаблону как тела и могут использоваться, например:

(run* [q]
  (fresh [a o]
    (== a [1 2 3 4 5])
    (matche [a]
            ([ [1 2 . [3 4 5] ]]
             (== q "first"))
            ([ [1 2 3 . [4 5] ]]
             (== q "second"))
            ([ [1 . _] ]
             (== q "third")))))
;=> ("first" 
;    "second"
;    "third")

(пример из Wikic-Starter wiki)

Но я не могу найти спецификацию синтаксиса для сопоставления шаблонов в документации по core.logic. Что это за синтаксис? Может быть, я могу найти его в некоторых документах или книгах minikanren?

  • В чем разница между согласованными переменными с префиксом ? и без нее?
  • Существуют ли какие-либо другие разрушающие конструкции в дополнение к спискам с . (аналогично & в clojure)?
  • Будет ли [_ _] соответствовать только последовательности с двумя элементами?
  • Можно ли разрушать карты?