게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

숙제3 모범답안

 
글 쓰기   답변 달기     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2012)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
강동옥



가입: 2009년 9월 18일
올린 글: 602

올리기올려짐: 2012년10월12일 17:51    주제: 숙제3 모범답안 인용과 함께 답변

숙제3 모범답안입니다.
http://ropas.snu.ac.kr/~ta/4190.210/12/hw/sol/hw3_sol.scm


강동옥 가 2012년10월24일 21:30에 수정함, 총 1 번 수정됨
위로
사용자 정보 보기 비밀 메시지 보내기
민현기



가입: 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한 케이스를 채점하는게 아니므로 둘다 맞다고 하겠습니다.
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
글 쓰기   답변 달기     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2012) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay