2010-11-06 2 views
2

Я попытался использовать реализацию mini-kanren в clojure. Но он пытался понять разницу между cond-cond-u и cond-e. Я, кажется, совершенно ясно о cond-e, но понимание cond-a и cond-u очень плохое.mini-kanren В чем разница между cond-cond-u и cond-e?

cond-e берет набор целей, а затем пытается каждый из них ... я пытаюсь все ветви, которые преуспевают.

cond-a и cond-u наоборот передают ветке, чей первый предикат преуспевает, и cond-a возвращает все возможные успешные объединения там после. в то время как cond-u возвращает только первую успешную унификацию ... но, похоже, это понимание неверно, когда я его использую. Может ли кто-нибудь помочь мне прояснить это понимание.

ответ

2

конд-е дает каждому ответ от всех ветвей, которые добились успеха

конд-я дает каждый ответ, но чередует их.

конд-а дает только ответы от первого успешного филиала

конд-U дает только первый ответ от первого успешного филиала

+0

Спасибо Джим .. Но что такое чередование? это как будто он получает один успешный ответ от каждой ветки. Прежде чем вернуться в первую ветку для следующего успешного ответа ...? –

+0

согласно вашему объяснению, следующий код должен вести себя одинаково, если я использую cond-u или cond-a вместо cond-? (Бег д (существуют [х] (cond- ((& х: неназначенный) неудачу) (успех)) (& д 20))) Но это, кажется, не так ... объясните, пожалуйста. –

2

Я просто пытаюсь получить мою голову вокруг этих вопросов. Существует краткая схема реализации Sokuza-kanren с несколькими комментариями, я прочитаю ее сегодня вечером.

+0

Было очень поучительно прочитать реализацию Сокудза-канрен. Спасибо за ссылку. – soegaard