2014-12-05 2 views
5

다음 두 예제에서 첫 번째 값이 올바른 값 (1)을 반환하는 이유는 알 수 없지만 두 번째 값은 ()을 반환합니다. 결과가 (:key)이거나 솔루션을 찾을 수 없다는 예외가 있었지만 빈 목록은 찾을 수 없습니다.core.logic 통합이 맵의 값과 일치하지만 키가 일치하지 않음

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

;; BUT IT DOESNT WORK 

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

run *는 솔루션 목록을 반환하므로()는 솔루션이 없음을 의미합니다. –

+0

동의하지만 해결책이 있습니다. 'q = : key'를 사용하면 방정식을 만족하지 않습니까? 나는 우리가 해결책을 읽을 필요가 있다고 생각한다. "해결책이 없다는 것을 보장 할 수있다"보다는 "해결책을 찾지 못했다"고 생각한다. – shaft

답변

3

는 내가 의도 한 행동을 문서화 여부,하지만 source code보고 발견되지 않은, 내 (제한적) 이해에서, 그것은 단지 값이 아닌 키 일어나는지도의 통일과 같다.

unify-with-map*에 구현

, core.logic 첫 번째지도에서 키 :key을 찾아, 그것을 찾을 수없는, 두 번째로 그 값을 조회하고, 통일에 이렇게 보석금. @Arthur Ulfeldt와 같은 해결책이 없기 때문에 ()으로 끝납니다.

+0

이 경우에는'core.logic'의 한계가 있습니까? 그러나 좋은 점은 알고 있어야합니다.) 검색 공간을 확장하여 키를 포함 시키면 더 많은 작업을 수행하게 될 것이므로 성능상의 단점이있을 수 있습니다. 놀랍게도,'core.logic'의 "솔루션 없음"은 솔루션이 존재 함에도 불구하고 해결할 수 없다는 것을 의미 할 수 있습니다. 따라서 "해결책 없음"은 보증이 아닙니다. 그러나 여전히 매우 강력하여 가치를 통일시킬 수 있습니다. 아마도 대부분의 시간 동안 어쨌든 사용하게 될 것입니다. – shaft

+0

네, 맞습니다. 맵 키는 lvars 일 수 없습니다. 그 내용은 문서화되지 않았지만 기능이 설계된 방식이었습니다. –

관련 문제