안중원 Site Admin
가입: 2023년 3월 13일 올린 글: 40
|
올려짐: 2026년4월9일 17:42 주제: [숙제 4] 공지사항 및 보충 세부사항 안내드립니다. (4/10 수정) |
|
|
안녕하세요 수강생 여러분,
숙제 4에 대한 공지사항 및 보충 세부사항을 안내해드리겠습니다.
안내사항이 많으나 주의해서 읽어주세요 🙂
내용 : https://ropas.snu.ac.kr/~kwang/4190.310/26/hw4.pdf
제출 : https://ropas.snu.ac.kr/~ta/4190.310/26/submit/index.pl
기한 : 4/18 밤 11시 59분 59초
제출 페이지에서 학번을 아이디로 하여 가입(register)하신 다음, 해당 계정으로 로그인하여 숙제를 제출하시면 됩니다. 가입 기간은 4/14까지입니다.
# 과제 관련 주의 사항
과제를 제출하기 전에 꼭 주의사항( https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=7620 )을 확인해 주세요.
# K- 언어 문법 및 의미 구조
https://kwangkeunyi.snu.ac.kr/4190.310/26/K/k-.pdf
* (4/10 수정) FieldAssign 규칙이 수정되었으니 참고 바랍니다.
# 뼈대 코드
* https://ropas.snu.ac.kr/~ta/4190.310/26/show/k_.zip (다운로드 문제 발생시 브라우저 새 탭에 주소를 입력해 주시기 바랍니다)
* (4/10 수정) examples/test7.k-에서, 주석에 적혀있는 실행 결과가 k-.pdf의 실행 의미 일치하도록 코드가 수정되었습니다.
* 뼈대 코드에는 K- 언어로 짜여진 프로그램을 읽어들이는 파서, K- 언어의 정의 및 실행기의 뼈대가 들어있습니다. k.ml 파일에서 TODO 로 표시해 둔 부분을 완성하여 실행기를 완성하시기 바랍니다.
* 뼈대 코드에는 여러분이 숙제를 쉽게 하실 수 있도록 보조 모듈과 보조 함수들에 제공됩니다.
* 뼈대 코드는 dune 빌드 시스템을 사용해서 작성되었습니다. `dune build --release`를 실행하면 컴파일이 되고, `_build/default/bin` 아래 `main.exe` 실행 파일이 생성됩니다. (UNIX에서도 마찬가지로 `main.exe`이니 착오 없으시길 바랍니다.)
이렇게 만들어진 `main.exe`를 실행하여 `examples` 디렉터리에 있는 예제를 실행기로 돌려볼 수 있습니다.
| 코드: | dune build --release
./_build/default/bin/main.exe examples/test1.k-
|
또한 K- 코드를 파싱하여 출력하는 기능도 있습니다:
| 코드: | ./_build/default/bin/main.exe -pp examples/test1.k-
|
`--release`를 붙여서 빌드를 하는 이유는, 아직 사용이 안 된 변수들이 있기 때문입니다. 과제를 완료하시고 모든 변수를 빠짐없이 사용하면 `--release` 플래그 없이도 컴파일이 문제없이 진행될 것입니다.
위와 같이 컴파일 후에 실행을 할 수도 있고, 또는 `dune exec` 명령어로 컴파일과 실행을 한번에 할 수도 있습니다.
| 코드: | dune exec --release -- bin/main.exe examples/text1.k-
dune exec --release -- bin/main.exe -pp examples/text1.k-
|
* 과제를 하실 때, 다른 쉘에서
| 코드: | dune build --release --watch
|
를 실행하면, 코드를 변경하실 때마다 자동으로 빌드가 진행됩니다. 이에 따라 편집기에서 실시간으로 타입 정보 등의 정보를 제공받을 수 있으니 유용하게 사용하세요.
# 보충 세부사항
(이 글에 답글로 질문하지 말아 주세요. 별도의 게시글로 질문해 주시기 바랍니다!)
## Exercise 1 "K- 실행기"
* 제출 시에는 뼈대 코드 중 k.ml 파일만 제출합니다. 꼭 주의해 주세요. 엉뚱한 ml 파일을 잘못 제출하시면 조교팀이 해결해 드릴 방법이 없습니다.
* read의 실행의미 구현에는 read_int 를, write의 구현에는 "print_endline (string_of_int n)"을 사용하는 것으로 합니다.
즉, hw3.pdf 에 설명된 대로 정수를 출력한 다음에 개행 문자(newline)를 출력해야 합니다.
마침 숙제의 감을 잡으실 수 있도록 뼈대 코드에 read와 write의 실행 의미를 정의해 두었으므로, 이 정의를 그대로 두시면 되겠습니다.
* K.run 의 결과는 출력 대상이 아닙니다. 입출력은 read/write 로만 이루어집니다.
* k-.pdf 에서는 레코드와 함수 호출 식에서 인자가 2개인 경우만 보여주었지만, 0,1개 혹은 2개 이상인 경우에도 비슷한 방식으로 의미가 정의된다고 보고 구현해주세요.
* 실행 의미 규칙이 정의되지 않은 경우 Error 예외를 발생시킵니다. 몇몇 구체적인 상황과, 각각의 경우 Error 예외의 문자열은 다음과 같이 정하겠습니다.
(1) 타입 에러 - 정수 값이 와야 하는 곳에 하는데 참/거짓(bool) 값이 나오거나, Addr이 나와야 하는데 Procedure가 나온 경우
| 코드: | | raise (Error "TypeError ...") |
TypeError 뒤에 추가적인 정보를 더 붙이셔도 됩니다. 예를 들어 아래와 같이 쓸 수 있습니다. 채점시에는 스트링의 앞 글자들만 매칭할 것이므로 모두 정답으로 인정됩니다.
| 코드: | Error "TypeError : not int"
Error "TypeError : boolean is expected" |
(2) Bind되지 않은 변수나 함수가 사용되는 경우
| 코드: | | raise (Error "Unbound") |
(3) callv, callr에서 함수에 넘겨준 인자 개수와 함수 정의에서 받는 인자 개수가 다른 경우 :
| 코드: | raise (Error "InvalidArg")
|
그 외에 실행의미가 정의되지 않은 경우에 대해서는, Error 예외의 문자열은 자유롭게 사용하시면 됩니다.
* 어느 예외가 먼저 발생해야 하는지 모호한 경우는 테스트하지 않겠습니다. 예를 들어
| 코드: | let proc f (x) = x in
f (1, 2 + true) |
는 Error "TypeError : ... "를 발생시켜야 하는 케이스에 해당하기도 하고, Error "InvalidArg"를 발생시켜야 하는 케이스에 해당하기도 합니다.
숙제 문서의 실행 의미 정의만으로는 어떤 예외가 우선시되는지 판단하기 애매하므로, 이런 경우는 테스트하지 않을 것입니다.
## Exercise 2 "K- 프로그래밍: 구조물 데이터"
* K- 언어로 프로그램을 작성하신 후, 확장자를 .txt로 하여 제출해 주세요. 중앙전산원에서 .k- 확장자 파일 제출을 차단하기 때문입니다.
* 제공해 드린 뼈대 코드로 실행했을 때 파싱 에러가 발생하지 않도록 해 주세요
* 구현해야 하는 모든 함수 작성 후 마지막에 ... in 2026 로 끝내주세요. 마지막에 숫자 2026로 끝내는 것은 파싱 에러를 피하기 위해서입니다.
즉 다음과 같은 형태가 되면 됩니다.
| 코드: | let proc leaf(i) =
...
in
...
...
let proc bft (t) =
...
in
2026 |
* dft 함수는 preorder로 방문하도록 작성해 주세요( https://en.wikipedia.org/wiki/Tree_traversal#Pre-order ).
bft 함수를 작성할 때는 왼편 자식 트리를 먼저 방문하도록 작성하시기 바랍니다.
예를 들어, 아래 트리의 dft 방문 순서, bft 방문 순서는 모두 1->2->3 이 됩니다.
* lTree의 인자로 makeRtree 또는 leaf로 만든 트리가 들어오는 경우. 혹은 rTree의 인자로 makeLtree 또는 leaf로 만든 트리가 들어오는 경우는 테스트하지 않으니 자유롭게 구현하시면 됩니다.
* 숙제에서 제시된 함수들은 모두 call-by-value로 호출될 때 올바르게 동작하도록 작성해주세요.
(예를 들어 채점시에는 if isLeaf (lTree (tr)) then write (1) else write (0) 이러한 코드의 실행결과가 올바른지 채점할 예정입니다.)
## Exercise 3 "탐사 준비"
* 별도의 뼈대코드는 없으며, 문제에 제시된 타입들을 파일에 포함한 상태에서 getReady 함수를 구현한 .ml 파일을 제출해주시면 됩니다.
* 탐험이 불가능할 때는 아래의 IMPOSSIBLE 예외를 발생시킵니다.
* Guide ("x", e1) 에 대해 다음과 같이 설명되어 있습니다.
| 인용: | | e1 안에서 만날 보물상자 x의 열쇠가 α이고 ... |
이때 e1 안에는 반드시 x 가 존재한다고 가정하겠습니다.
* getReady 가 내놓는 키 리스트에서 원소들의 순서는 상관 없습니다. 다만 리스트에 겹치는 원소는 없어야 합니다.
* (4/10 추가) 금열쇠와 은열쇠는 항상 모양이 다르다고 간주합니다. 예를 들면, 은열쇠 "(-,-)"로 열리는 상자는 금열쇠 "(=,=)"나 금열쇠 "="로는 열 수 없습니다.
아래는 문제의 이해를 돕기 위한 보충 설명입니다.
'보물지도에서 암시하는 열쇠모양'이라는 것은, 실제로 보물상자를 열 때 필요한 열쇠모양이 아니라고 보셔도 됩니다. 단, 이 보물지도에서 암시하는 열쇠모양을 제대로 알아낼 수 있다면 그 정보를 통해 실제 보물상자들을 여는 열쇠모양을 모두 알아낼 수 있다고 생각하시면 됩니다.
숙제문서의 두번째 예제를 보면서 생각해보겠습니다. 각 보물지도가 암시하는 열쇠의 모양에 대한 표를 참고하시면, (안내판x : x) 꼴의 보물지도에서 시작점이 암시하는 모양은 (-,-) 라고 볼 수 있습니다. 실제로는 ((-,-), (-,-)) 등 여러가지 경우가 있을 수 있겠지만, 열쇠꾸러미 크기를 최소로 한다고 하였으니 (-,-)라고 보시면 됩니다.
이제 이 보물지도가 암시하는 열쇠모양을 제대로 알아냈으니, 실제로 보물상자를 열기위해 필요한 열쇠 모양을 생각해봅시다. 지도의 시작점이 암시하는 열쇠모양이 (-,-)라는 걸 알아냈고, 안내판에 x가 쓰여 있었으니, x라는 보물상자는 -로 열 수 있다고 생각할 수 있을 것이고, 실제로 만나게 되는 보물상자도 x 뿐이니 숙제문서의 두번째 예제는 - 하나로도 탐사를 마칠 수 있는 것입니다.
세번째 예제도 간단하게 설명드리자면, ((안내판x : x) | star) 꼴의 보물지도에서 뒤쪽의 star부분이 암시하는 열쇠모양은 -입니다. 여기서 맨 처음 시작점이 암시하는 열쇠모양을 판별해야 하는데, (안내판 x : x)의 시작점이 암시하는 열쇠모양은 (-,-) 혹은 ((-,-) , (-,-))와 같이 여러가지 모양이 있을 수 있습니다. 하지만 보물지도 암시 규칙표의 마지막 부분을 보시면, 앞선 (안내판 x : x) 시작점이 암시하는 열쇠모양이 (-,-)가 되어야만 맨 처음 시작점이 암시하는 열쇠모양이 -로 제대로 나오게 됩니다. (star의 -와 모양을 맞춰야 하기 때문이죠.)
위와 같이 보물지도의 열쇠모양 암시에 성공했으므로, 그 정보들을 가지고 보물상자를 열기위한 열쇠모양을 찾아보면, 전체 보물지도에서 보물상자는 x와 star입니다. star는 -로 열 수 있는 것이 자명하며, x 또한 위의 열쇠모양 암시를 보면 -로 열 수 있다는 것을 알 수 있습니다.
이런 식으로 각 위치에서 암시하는 열쇠모양과 실제 필요한 열쇠꾸러미를 구분하여 푸시면 됩니다.
(4/10 추가) 8번째 예제도 간단히 설명드리겠습니다. 이 예제에서는 모든 x와 y 상자가 금열쇠 =로 열립니다. 첫번째 x는 두꺼풀 펼쳐 ((=,=),(=,=))로 열고, 두번째 x는 한꺼풀 펼쳐 (=,=)로 열 수 있습니다. 이때 갈림길 (x|x)가 암시하는 열쇠 모양은 (=,=)가 되고, (안내판x : (x|x))가 암시하는 열쇠 모양은 ((=,=),(=,=))가 됩니다. y는 =를 그대로 사용하여 열리기 때문에 (안내판y : (y|y))가 암시하는 열쇠 모양은 (=,=)가 됩니다. 양쪽 갈림길이 암시하는 열쇠 모양을 조합하면 시작점이 암시하는 열쇠 모양은 (=,=)가 됩니다.
(4/10 추가) 반면 4번째 예제는 탐험이 불가능합니다. 마지막의 star가 은열쇠 -로만 열리기 때문에, (안내판x : x|x)가 암시하는 모양은 (-,?)가 되어야 하고 x는 은열쇠 -로 열려야 합니다. 그런데 갈림길 규칙에 따르면 첫번째 x가 암시하는 모양이 (?,?) 꼴이 되어야 하기 때문에 x는 어떤 열쇠로 열린다고 해도 모순이 됩니다.
감사합니다. _________________ TA 안중원
TA e-mail: ta310@ropas.snu.ac.kr
personal e-mail: jwahn@ropas.snu.ac.kr |
|