강동옥
가입: 2009년 9월 18일 올린 글: 602
|
올려짐: 2014년9월18일 18:12 주제: 숙제 2 변경사항 및 스펙 정리 (9/27 13:00 기준) |
|
|
숙제 2와 관련하여 확정된 스펙을 모아놓은 게시글입니다.
질문은 이 글의 댓글로 다시지 말고, 게시판에 별도의 글을 통해 해 주세요.
--
Exercise 1 "CheckMetroMap"
--
Exercise 2 "왼쪽편에 쏠려있는 힙"
1) 문제에서 주어진 뼈대코드 중 rank 함수를 아래와 같이 수정합니다.
코드: |
let rank = function EMPTY -> -1
| NODE (r, _, _, _) -> r
|
--
Exercise 3 "짚-짚-나무"
- 아래 NOMOVE 예외를 선언해 주셔야 합니다.
코드: | exception NOMOVE of string |
-그리고, goLeft함수의 마지막 줄(네번째 줄)은 아래와 같이 수정해야 합니다. (raise의 인자를 괄호로 감싸야 합니다.)
코드: | | LOC(t, HAND([],up,right)) -> raise (NOMOVE "left of first") |
- goDown은 자식 노드의 맨 왼쪽 으로 갑니다. 갈 수 없을 경우 NOMOVE 예외로 처리해 주세요
--
Exercise 4 "Galculator"
- 계산 도중 묶여있지 않은 변수를 만날 경우 FreeVariable 예외를 냅니다.
아래 코드를 참고하시고 숙제 제출시 포함해 주세요.
코드: | exception FreeVariable |
- 계산 식의 SIGMA, INTEGRAL 등의 의미는 우리가 수학적으로 알고 있는 그것과 동일합니다. 헷갈리기 쉬운 몇몇 경우에 대해서는 다음과 같이 정하겠습니다.
(1) SIGMA 계산시 시작 값이 끝 값보다 클 경우 0을 리턴합니다.
(2) INTEGRAL(a, b, f)에서 a>b인 경우, -INTEGRAL(b,a, f) 의 값을 계산하시면 됩니다.
(3) INTEGRAL 계산시 시작과 끝 값의 차가 0.1 미만인 경우 0을 리턴합니다.
(4) SIGMA, INTEGRAL 의 대상 인자인 튜플의 첫 두 인자는 모두 어떤 exp든 올 수 있습니다. 단, SIGMA의 경우 첫 두 인자를 계산한 결과가 실수(float)일 경우 이를 정수로 바꾸어 계산합니다. 실수 -> 정수 변환에는 OCaml 내장 함수인 int_of_float 을 사용하도록 하겠습니다.
- SIGMA(1.4, 1.3, f)와 같은 식의 경우 위의 (1)과 (4) 중에 어떤 것을 먼저 적용하는지에 따라 결과값이 0이 될 수도 있고 f(1)이 될 수도 있을 텐데, 이런 경우는 테스트하지 않겠습니다. 즉, 어떻게 구현해도 무방합니다.
- INTEGRAL 계산시 구분구적법 형태로 계산하게 되는데, 이 때 고려하는 직사각형의 높이는 왼쪽 함수값을 기준으로 합니다.
즉, f 함수의 적분 계산시 구분구적법에서 구간 [a, b]를 만나면 해당하는 직사각형의 높이는 f(a) 가 됩니다.
- OCaml floating-point arithmetic 의 불확실성에 의해 발생할 수 있는 계산 오차는 무시하셔도 됩니다.
(예를 들어, 1.1 -. 1.0 > 0.1 식이 true 가 리턴되는 현상)
계산 값이 실수일 경우 오차 범위를 주는 식으로 채점할 예정이며, 테스트 케이스 또한 논란의 여지가 없는 식을 사용할 예정입니다.
- 변수로 주어지는 X는 항상 변수를 감싸고 있는 가장 안쪽의 SIGMA 또는 INTEGRAL 에 묶이는 것으로 합니다.
가장 안쪽의 어떤 SIGMA, INTEGRAL 도 없다면 FreeVariable 예외를 내시면 됩니다.
- SIGMA 계산시 n = a to b 라 할 때 a > b 인 경우 0을 리턴하도록 합니다.
- floating-point, integer arithmetic 은 OCaml 의 그것을 그대로 사용하도록 합니다.
float 의 infinity/neg_infinity/nan 을 그대로 계산에 사용하며,
정수에서의 Division_by_zero 예외도 따로 처리 하지 않고 그대로 예외를 내시면 됩니다.
단, 정수의 사칙연산을 사용할지 실수의 사칙연산을 사용할지는 자유롭게 의미를 주시고 선택하시면 됩니다.
채점시 혼란의 여지가 있을 수 있는 테스트 케이스는 사용하지 않겠습니다.
- 정수 -> 실수 변환에는 OCaml 내장 함수인 float_of_int 를 사용하도록 하겠습니다.
--
Exercise 5 "Queue = 2 Stacks"
- 어떤 코드를 작성해야 하는지에 대해서: 숙제의 템플릿을 그대로 따라가는 IntListQ 모듈을 구현하는 것으로 하겠습니다.
숙제에는 module IntListQ 뒤에 Queue 타입인지를 확인하는 ": Queue" 가 없음에 유의해 주세요.
구현하신 IntListQ 가 Queue 타입인지를 확인하려면 아래 코드가 정상적으로 해석되는지 보면 됩니다.
제출하실때는 물론 아래 코드는 제거하셔야 하고요. (Queue signature는 코드에 포함)
코드: | module ValidIntListQ = (IntListQ: Queue) |
위의 코드를 통해 조교팀에서도 IntListQ 가 충실하게 구현되었는지 확인할 예정입니다.
--
Exercise 6 "계산실행"
- 숙제 pdf 오타 수정
1) 아래 코드의 env 를 environment 로 수정.
코드: | val eval: env * expr -> value |
2) 예제의 1, 2 등의 숫자를 모두 NUM 1, NUM 2 등으로 수정.
- <strike>뼈대 코드를 잠시 뒤에 올려 드리겠습니다. </strike>뼈대 코드를 제공하는 대신, 모듈 타입(시그니쳐)를 아래와 같이 변경하는 것으로 하겠습니다. 숙제 문서에 나온 대로, 이러한 시그니처를 갖는 모듈 Zexpr을 작성하시면 됩니다.
코드: |
module type ZEXPR = sig
exception Error of string
type id = string
type expr =
| NUM of int
| PLUS of expr * expr
| MINUS of expr * expr
| MULT of expr * expr
| DIVIDE of expr * expr
| MAX of expr list
| VAR of id
| LET of id * expr * expr
type environment
type value
val emptyEnv : environment
val eval : environment * expr -> value
val int_of_value : value -> int
end
|
0) 문법을 ocaml에 맞게 조금 수정한 것입니다.
1) <strike>뼈대 코드</strike> 수정된 모듈 타입(시그니처)에는 구현해야 할 함수가 하나 더 추가되어 있습니다. (int_of_value)
2) 숙제 문서에 있는 "최종 값을 프린트하고..."는 위의 int_of_value 함수를 구현하는 것으로 대체합니다.
- Error 예외 문자열을 다음과 같이 구분합니다.
1) 현재 환경에서 정의되지 않은 이름이 사용될 때 : "FreeVariable"
- 합, 곱, 나누기 등의 모든 사칙연산은 정수 사칙 연산을 따르도록 합니다. 예를 들어, DIVIDE(3,2)의 결과값은 1.5가 아닌 1입니다. 정수에서의 Division_by_zero 예외도 따로 처리 하지 않고 그대로 예외를 내시면 됩니다.
-- |
|