2013-08-28 4 views
1

내가 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)가있는 적절한 목록이었습니다. 그들의 문자열 표현은 동일하지만 그럼에도 불구하고 다릅니다.

+0

저는 논리 koans에 연결해 주셔서 감사드립니다. 나는 그들을 결코 알지 못했고 그들이 굉장하다고 말해야 만합니다. 그들은 core.logic 페이지에 링크되어야합니다! –

답변

2

(a . b) 표기법은 합리적인 셀을 사용하여 부적절한 목록을 작성하는 다른 리스프에서 오는 내용입니다. 당신은 그것이 "어떤 길이의 목록이라도 따르는 기호 고양이"를 의미한다는 것이 맞지만 실제로는 핵심 LCons 값의 인쇄 된 표현입니다. 유형의 값을 생성하기 위해 입력 할 수있는 쉬운 리터럴이 없으므로 자신의 값으로 비교할 수는 없습니다. 그러나 LCons가 seqable 일 것으로 예상하므로 (first the-thing)'cat을 비교할 수 있습니다.

+0

감사합니다. + amalloy. 자세한 질문과 몇 가지 링크로 질문을 업데이트했습니다. – DNNX