Расширяя предложение @ amlloy, я могу попробовать это:
(defn multipleo
[multiple value]
(fresh [n]
(conde
[(== multiple 6)]
[(== multiple 3)])
(fd/in n (fd/interval 1 10))
(fd/* n multiple value)))
(run* [q] (multipleo q 12))
=> (6 3)
Кажется, это работает.Насколько я могу судить, заказ домена в fd / in не влияет.Но если я переместу записи домена intp conde
в порядке, который я предпочитаю, это работает.Без conde
приведенный выше код выдаст (3 6)
.Однако это намного медленнее , чем подход fd / in.Я думаю, что fd / in делает несколько хороших трюков с производительностью по сравнению с просто conde.
Я также пробовал condu
, но это не сработало, как я ожидал.
(defn multipleo
[multiple value]
(fresh [n]
(condu
[(== multiple 6)]
[(== multiple 3)])
(fd/in n (fd/interval 1 10))
(fd/* n multiple value)))
(run* [q] (multipleo q 3))
=> ()
Iожидал бы, что первая группа condu
потерпит неудачу, так как общая логика не может быть успешной, w / кратный = 6, в этом примереМожет кто-нибудь помочь мне понять, почему это не работает, как я ожидаю?