2014-12-05 21 views
5

Neden aşağıdaki iki örnekten anlamıyorum, birincisi (1) doğru değerini döndürürken, ikincisi () döndürür. (:key) sonucunu beklerdim ya da çözümü bulamadığı bir istisna, boş bir liste değil.core.logic birleştirme eşlemede değil, değerde eşleşiyor

(l/run* [q] 
    (l/== {:key 1} {:key q})) 

;; BUT IT DOESNT WORK 

(l/run* [q] 
    (l/== {:key 1} {q 1})) 
+1

* çözümlerin bir listesini döndürür, bu nedenle() –

+0

no'lu çözüm anlamına gelmez, ancak benim anlayışım için bir çözüm var. Eğer 'q =: key' kullanırsanız, bu denklemi tatmin etmiyor mu? Bence cevabı şu şekilde okumalıyız: '' Hiçbir çözümün bulunmadığını garanti edemem 'yerine' bir çözüm bulamadı '. – shaft

cevap

3

ben amaçlanan davranış olarak belgelenmiş ya da değil, ama source code bakarak bulamadı, benim (sınırlı) anlayışından, sadece değerler değil, tuşları ile olur haritaların birleşmesi gibi görünüyor.

unify-with-map* uygulandığı gibi

, core.logic ilk haritasında kilit :key bulur, onu bulamazsa, ikinci değerini arar ve birleşmesine ilişkin yüzden kefaletlerdir. Çözüm olmadığından, @Arthur Ulfeldt'in dediği gibi, () ile bitersiniz.

+0

Bu durumda 'core.logic' sınırlaması var mı? Ama farkında olmak için iyi bir şey;) Benim düşünceme göre, arama alanını anahtarlar içerecek şekilde genişletirseniz, muhtemelen daha fazla iş çıkarırsınız, bu yüzden bir performans değiş tokuşu ile ilgili olabilir. Benim için sürpriz, "core.logic" içinde "çözüm yok" sadece bir çözüm var olmasına rağmen çözemediği anlamına gelebilir. Yani "çözüm yok" bir garanti değildir. Ama yine de oldukça güçlü olan değerleri birleştirebilir ve muhtemelen bu çoğu zaman zaten kullanacağınız şeydir. – shaft

+0

Evet, bu doğru. Harita anahtarları lvar olamaz. Çok belgelenmemiş olabilir, ancak özelliğin tasarlandığı yol buydu. –

İlgili konular