| 이전 주제 보기 :: 다음 주제 보기 |
| 글쓴이 |
메시지 |
강동옥
가입: 2009년 9월 18일 올린 글: 602
|
|
| 위로 |
|
 |
민현기
가입: 2012년 9월 15일 올린 글: 29
|
올려짐: 2012년10월12일 20:42 주제: |
|
|
(sub-proc tree_list nat) 이 함수가 list를 받는 것이 최소 유추가 아닌 것 같습니다.
| 인용: | (define (sub-proc tree_list nat) ; sub-proc: T list * int -> T, tree_list: T list, nat: int
(cond ((= nat 0) (car tree_list))
(else (sub-proc (cdr tree_list) (- nat 1)))
)
|
내부 구현이 이렇게 되어 있는데 이 경우
(sub-proc (cons 'a 'b) 0)
(sub-proc (cons 'a (cons 'b 'c) 1)
등을 입력하면 정상적으로 작동합니다.
최소한 null? 정도는 있어야 scheme에서 list인지 확실히 유추할 수 있지 않을까요?
현재로서는 car과 cdr만을 사용했기 때문에 pair 로 유추하는 것이 맞는 것 아닌가요? |
|
| 위로 |
|
 |
강동옥
가입: 2009년 9월 18일 올린 글: 602
|
올려짐: 2012년10월13일 0:38 주제: |
|
|
말씀하신게 맞습니다.
sub-proc만 보면 T X T * int-> T가 더 맞네요.
고치도록 하겠습니다.
또 틀린게 있다면 언제든지 지적해주세요. |
|
| 위로 |
|
 |
민현기
가입: 2012년 9월 15일 올린 글: 29
|
올려짐: 2012년10월13일 3:09 주제: |
|
|
음.. 그러면 nth-child 역시 바꿔줘야 할 것 같습니다.
| 인용: | (define (nth-child tree nat) ; nth-child: (symbol X T list) * int -> T, tree: symbol X T list, nat: int
(define (sub-proc tree_list nat) ; sub-proc: T X T * int -> T, tree_list: T X T, nat: int
(cond ((= nat 0) (car tree_list))
(else (sub-proc (cdr tree_list) (- nat 1)))
)
)
(if (is-leaf? tree)
(error "tree is leaf")
(sub-proc (cdr tree) nat))
)
|
여기서 nth-child 는 (sub-proc (cdr tree) nat)) 를 호출하므로
(symbol X T list) * int -> T 를
symbol X (T X T) * int -> T 로 바꿔줘야 할 것 같습니다. |
|
| 위로 |
|
 |
강동옥
가입: 2009년 9월 18일 올린 글: 602
|
올려짐: 2012년10월14일 9:35 주제: |
|
|
| 맞습니다 고치도록 하겠습니다. |
|
| 위로 |
|
 |
조동철
가입: 2011년 9월 6일 올린 글: 35
|
올려짐: 2012년10월16일 15:00 주제: |
|
|
| 인용: |
(define (sub-proc tree_list nat) ; sub-proc: T list * int -> T, tree_list: T list, nat: int
(cond ((= nat 0) (car tree_list))
(else (sub-proc (cdr tree_list) (- nat 1)))
) |
저는 여기서 sub-proc의 인자, tree_list는 최소 추정에도 T list인게 맞는거 같습니다.
1) 만약, tree_list가 (T X T)라면,
본 함수의 콜에서의 sub-proc의 인자는 (T X T)이지만,
본 함수의 콜 내부에서 이루어지는 재귀 콜에서의 sub-proc의 첫 번째 인자는 (T)가 됩니다.
2) tree_list가 T list라면,
본 함수의 콜에서의 sub-proc의 인자는 T list이며,
본 함수의 콜 내부에서 이루어지는 재귀 콜에서의 sub-proc의 첫 번째 인자도 T list가 됩니다.
이러한 점에서 첫 번째 인자는 (T X T)가 아니라 T list인거 같습니다. |
|
| 위로 |
|
 |
민현기
가입: 2012년 9월 15일 올린 글: 29
|
올려짐: 2012년10월16일 20:22 주제: |
|
|
제 생각에는 T list 로 추정한 경우에는 문제가 생기는 것 같습니다.
빈 리스트, 즉 '() 나 null 역시 T list 인데 (car null), (cdr null) 은 정의가 되어있지 않습니다.
그런데 sub-proc 는 (null? tree_list) 가 없기 때문에 이러한 케이스를 걸러내지 못한채로 (car tree_list) 또는 (cdr tree_list) 를 호출합니다.
따라서 (sub-proc null 0) 등은 아예 정의가 되지 않기 때문에 T list 가 최소 추정이 될 수 없습니다.
하지만 T X T 의 경우 (sub-proc TxT 0) 는 항상 잘 정의되고 작동하기 때문에 추정이 가능합니다. |
|
| 위로 |
|
 |
조동철
가입: 2011년 9월 6일 올린 글: 35
|
올려짐: 2012년10월16일 22:20 주제: |
|
|
빈 리스트를 넣은 경우 문제가 생기는 건, 코드가 완전하게 예외사항 처리를 하지 않아서 생기는 문제일 뿐인 것 같습니다.
type check 기능이 있는 ocaml로 코드를 옮겨서 확인해 보면, 간접적으로 알 수 있습니다.
| 코드: |
let rec subproc = fun tree_list nat -> match (tree_list, nat) with
| (hd::rmd, 0) -> hd
| (hd::rmd, nat) -> subproc rmd (nat-1);;
|
이 경우, 마찬가지로 null? 과 같은 null list 체크를 하지 않습니다.
하지만 이때, subproc의 타입은
| 인용: | | val subproc : 'a list -> int -> 'a = <fun> |
로 나타납니다.
즉, null list인지 체크하는 루틴과는 관계없이
T list * int -> T 가 가능함을 간접적으로 확인할 수 있습니다.
덧붙여, 첫 번째인자를
(T X T) 타입이라고 생각할 때,
재귀 콜에서는 첫 번째 인자가 T 타입이 됩니다.
그러면 (T X T)와 T 가 같다는 말이 되는데, 이를 잘 정의되었다고 볼 수는 없을것 같습니다.
만약, 위의 상황에서 tree_list를 pair 타입으로 강제하여 ocaml 코드로 typecheck를 시도해보면,
| 코드: | let rec subproc = fun tree_list nat -> match (tree_list, nat) with
| ((hd,rmd), 0) -> hd
| ((hd,rmd), nat) -> subproc rmd (nat-1);; |
(T X T)와 T가 같다는 충돌로 typecheck의 결과가 나오지 않습니다. |
|
| 위로 |
|
 |
강동옥
가입: 2009년 9월 18일 올린 글: 602
|
올려짐: 2012년10월17일 19:49 주제: |
|
|
해당 함수를 Ocaml로 체크해보는것은 불가능합니다.
일단 Ocaml은 리스트가 페어의 조합으로 이루어져 있지 않습니다.
아무튼, 조교도 처음에 모범답안을 T list로 올렸었고
숙제 의도가 너무 triky한 케이스를 채점하는게 아니므로 둘다 맞다고 하겠습니다. |
|
| 위로 |
|
 |
|