내가 Clojure의/core.logic 화두를하고 this one에 붙어있어 다음 REPL에서 (run 1 [q] (membero 'cat q))
실행왜 (= (실행 1 [q] (membero '고양이 q)) ['(고양이 _.0)]) 거짓입니까?
"Here we give run a specific number to control how many answers we get. Think
carefully. Is there only one list in the universe that satisfies this relation?
Are there infinitely many?"
(= (run 1 [q]
(membero 'cat q))
[__])
대답은 ((cat . _.0))
라고 나에게 말했다. 중간에있는 점이 무엇인지는 확실치 않지만 어쨌든 __
자리 표시 자 대신 '(cat . _.0)
을 붙이면 도움이되지 않습니다 (어설 션이 여전히 실패 함). 올바른 방향으로 나를 가르쳐 주시겠습니까? 또한 cat
과 _.0
사이의 점을 의미하는지 설명하십시오. 내 생각에 다음에 오는 것은 입니다 (즉, _.0
)는 길이가 인 꼬리이지만 100 % 확실하지는 않습니다.
amalloy === UPDATE은 (선생님 감사합니다!) 올바른 방향으로 나를 지적했다.
(= (run 1 [q]
(membero 'cat q))
[(lcons 'cat '_.0)])
그리고 REPL의 비트 :
user=> (lcons 'cat '_.0)
(cat . _.0)
user=> '(cat . _.0)
(cat . _.0)
user=> (= '(cat . _.0) (lcons 'cat '_.0))
false
도트는, dotted lists이 잘 표현하기 위해 사용되는 lcons
트릭을 수행합니다. Wikipedia에 따르면 점으로 구분 된 목록은 일종의 부적절한 목록이며 다른 종류는 순환 목록입니다. 위의 REPL 세션에서 첫 번째 목록은 두 개의 요소 ('cat
및 '_.0
)가있는 점으로 구분 된 목록 이었지만 두 번째 목록은 세 개의 요소 ('cat'
, '.
및 '._0
)가있는 적절한 목록이었습니다. 그들의 문자열 표현은 동일하지만 그럼에도 불구하고 다릅니다.
저는 논리 koans에 연결해 주셔서 감사드립니다. 나는 그들을 결코 알지 못했고 그들이 굉장하다고 말해야 만합니다. 그들은 core.logic 페이지에 링크되어야합니다! –