2010-11-06 3 views
2

J'ai essayé d'utiliser une implémentation de mini-kanren dans clojure. Mais lutté pour comprendre la différence entre cond-a cond-u et cond-e. J'ai l'impression d'être très clair à propos de cond-e mais la compréhension de cond-a et de cond-u est silencieuse.mini-kanren quelle est la différence entre cond-a cond-u et cond-e?

cond-e prend un ensemble de buts et essaie ensuite chacun d'eux ... c'est-à-dire qu'il essaye toutes les branches qui réussissent. Au contraire, cond-a et cond-u s'engagent au contraire à la branche dont le premier prédicat a réussi et cond-a renvoie toutes les possibles unifications réussies après. alors que cond-u renvoie seulement la première unification réussie ... mais il semble cependant que cette compréhension n'est pas correcte quand je l'utilise. Quelqu'un peut-il m'aider à clarifier cette compréhension?

Répondre

2

-e donne cond toutes les réponses de toutes les branches qui réussissent

-i donne cond toutes les réponses, mais les entrelace.

-a donne cond que les réponses de la première branche réussie

-u donne cond seule la première réponse de la première branche réussie

+0

Merci Jim .. Mais Qu'est-ce que l'entrelacement? est-ce que ça obtient une réponse réussie de chaque branche ... avant de revenir à la première branche pour la prochaine réponse réussie ...? –

+0

Selon votre explication le code suivant devrait se comporter de la même façon que j'utilise cond-u ou cond-a à la place de cond-? (Q exécuter (exist [x] (cond- ((& x: unassigned) échouent) (réussir)) (& q 20))) Mais cela ne semble pas être le cas ... Pouvez-vous m'expliquer s'il vous plaît? –

2

Je voulais juste obtenir ma tête autour de ces questions. Il y a une implémentation de schéma simplifié Sokuza-kanren avec quelques commentaires, je vais le lire ce soir.

+0

C'était très instructif de lire la mise en œuvre de Sokuza-kanren. Merci pour le lien. – soegaard

Questions connexes