게시판 인덱스

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

숙제4-1 간단한 테스트셋

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2010)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
최종욱



가입: 2009년 9월 15일
올린 글: 84

올리기올려짐: 2010년10월20일 19:41    주제: 숙제4-1 간단한 테스트셋 인용과 함께 답변

안녕하세요. 숙제 잘들 하고 계신가요.

다들 잘 하셨을 거라 믿지만, 확인차 elementary한 간단한 테스트 셋을 올려 봅니다.


수정 #1 (오후 8:15): For에서 이상한 데이터 두개 지웁니다 ㅠ
수정 #2 (오후 8:41): WRITE 부분 테스트 셋을 보강하였습니다.
수정 #3 (오후 10:19):
조교님의 답변을 고려하여, FOR 부분을 비롯한 몇 개 테스트 데이터의 답을 수정했습니다.
--


WRITE를 구현한 경우

코드:

(* TRICKY WRITE TEST *)

let t := (write 3) in
if t = 3 then
        write 1
else write 0

(*RESULT : 3 1 *)


-> [수정 #2]에서 추가
코드:

(* TRICKY WRITE TEST 2 *)

let x := 0 in
((
let t := (write (x:=x+1; 3)) in
if t = 3 then
        write 1
else write 0 ); write x)

(*RESULT : 3 1 1 *)



LETV를 구현한 경우

코드:
(* UNBIND TEST   *)

 let x := 1 in
        let y := 2 in
                ((let y := 4 in
                        write x + y) ;
                write x + y)
       
(* RESULT : 5 3 *)



ASSIGN도 구현한 경우

코드:

(* ASSIGN TEST *)
let t := 1 in
        (
                (t := 2; write t);
                t := 4;
                write t;
                let t := 3 in
                        write t;
                write t
        )
(* result : 2 4 3 3 *)



코드:

(* TRICKY ASSIGN TEST *)
(let t:= 1 in   write (t := 3) );
let t := false in
        if (t := true) then
                write 1
        else
                write 2
(* result : 3 1 *)



LETF, CALLV를 구현한 경우


코드:

(* CALLV TEST *)
let proc f(x) =
        (x := 3;
        x := 4;
        x := 5)
in
let x := 1 in
        ( f(x); write x)

(* result : 1 *)


코드:

let proc f(x) =
        let proc f(x) =
                x + 3
        in
        f(x)
in
write f(3)
(* result : 6  *)


코드:


let proc f(x) =
        let y := x + 3 in
                y
in
write f(4)

(* result : 7  *)


코드:

(* TRICKY CALL TEST *)

let t := 8 in
let proc f(x) =
        let t := 0 in
                t+1
in
write t

(* RESULT : 8 *)



RECURSIVE CALL을 구현한 경우
코드:


(
let proc g(x) =
        x + 1
in write g(10)
);
(
let proc f(x) =
        if x = 0 then 0
        else if x = 1 then 1
        else
                f(x-1) + f(x-2)
in
write f(10)
)

(* RESULT : 11 55 *)



CALL BY REFERENCE 를 구현하면

코드:
let proc f(x) =
        x := 3
in
let x := 1 in
        ( f<x>; write x)
(* result : 3 *)



WHILE을 구현한 경우

코드:

let t := 8 in
while not (t = 0) do
        (
        write t;
        t := t-1
        )
(*result : 8 7 6 5 4 3 2 1 *)


코드:

(* TRICKY WHILE *)
let t := 0 in
let b :=

while (t < 10) do
        (
        write t;
        t := t+1
        )
 in

if b = () then write 111
 else write -111

(* result : 0 1 2 3 4 5 6 7 8 9 111 *)



FOR 을 구현한 경우

코드:

(* TRICKY *)

let i := (-1) in
( (for i := 1 to 5 do
        (write i)
); write i)

(* RESULT : 1 2 3 4 5 5 *)


-- 수정 #3
코드:

let i := 0 in
for i := 1 to 10 do
        (write i;
        i := i+1)
(* result : 1 2 3 4 5 6 7 8 9 10 *)


코드:

(* NESTED FOR TEST *)
let i := 0 in let j := 0 in
for i := 1 to 3 do
        for j := 1 to 3 do
                write (i+j)
(* result : 2 3 4 3 4 5 4 5 6 *)



#수정 3에서 엄청 tricky 하게 바뀜 ㅠㅠ
코드:

(* TRICKY! - NESTED FOR TEST 2 *)
let i := 0 in
for i := 1 to 5 do
        (for i := 1 to 5 do
                (write i; i := i+3)
        ; write i)

(*result : 1 2 3 4 5 8 1 2 3 4 5 8 1 2 3 4 5 8 1 2 3 4 5 8 1 2 3 4 5 8 *)



코드:

(* FOR, WHILE SEMANTIC TEST *)
let i := 1 in
let v := (for i := 1 to 2 do write 2 ) in
let w := (while false do write 1 ) in
if v = w then write 1
else write 2
 (* result : 2 2 1 *)


코드:

(* TRICKY FOR TEST *)

let i := 0 in
for i := 1 to 10 do
        let i := i in
        for i := i to 10 do
                write i



혹시 잘못된거나 이상한 점이 있으면 알려주세요~

참고 : ./run 해서 standard input 로 복붙해 넣으시면 편합니다
_________________
Jongwook Choi
Seoul National University, School of Computer Science & Engineering


최종욱 가 2010년10월20일 22:22에 수정함, 총 2 번 수정됨
위로
사용자 정보 보기 비밀 메시지 보내기
최종욱



가입: 2009년 9월 15일
올린 글: 84

올리기올려짐: 2010년10월20일 20:20    주제: 인용과 함께 답변

조교님 및 다른 수강생들께 질문합니다.

코드:
let i := 0 in
for i := 0 to 5 do
(i:=i+10; write i)


처럼, for문안의 반복자 변수의 값이 도중에 바뀌는 경우

K-에서 실행시켜보면

코드:
10
11
12
13
14
15


와 같은 결과가 나오는데요,

이게 i 는 루프 안에서 어떤 일이 일어나 i를 지지고 볶고 해도 [...]

결국 처음에 정한 순서대로 옛날 값으로 돌아간다는 뜻으로 보입니다.

(k.ml 에서도 그렇게 코딩되어 있구요)


이게 원래 의도된 K의 semantic인가요?

for loop 안에서 반복자의 값이 바뀌는 경우,
당연히 바뀌는 경우도 고려해야 하는 게 맞다고 생각했는데

그게 아닌가 보군요...... -_-;;

semantic을 애초에 어떻게 정의하느냐에 따라 또 약간 달라질 수 있겠지만요.


semantic 문서를 따로 제공해 주시지 않아서 직접 돌려보고 k.ml을 읽어 봐야 이런 세세한 문제를 알 수 있다는 문제점이 있는것 같습니다 ㅠㅠ



--

위 테스트 셋에서는, 그냥 ./run -k 로 실행했을 때의 결과랑 동일하게 나오도록 숙제를 해야 할 것 같습니다. 테스트셋 돌려보신 분들께 착오를 드려 죄송합니다 ㅠㅠ

이에 조교님들의 의견 기다리겠습니다~^^
_________________
Jongwook Choi
Seoul National University, School of Computer Science & Engineering
위로
사용자 정보 보기 비밀 메시지 보내기
조성근



가입: 2009년 9월 14일
올린 글: 283

올리기올려짐: 2010년10월20일 20:55    주제: 인용과 함께 답변

위에서 보이는 for문의 동작은 의도된 것이 맞습니다.

K-- 언어의 의미구조는 교과서 81페이지에 나와 있습니다. for문을 위한 의미구조를 보시면 매루프마다 반복자 변수의 값이 처음에 정한 순서대로 할당이 되는 것을 알 수 있습니다.
위로
사용자 정보 보기 비밀 메시지 보내기
구원준



가입: 2009년 9월 24일
올린 글: 11

올리기올려짐: 2010년10월20일 21:34    주제: 인용과 함께 답변

감사합니다 Smile

테스트 케이스에서 for semantic 잘못 적용한 부분 있어서 수정할 수 있었네요~
위로
사용자 정보 보기 비밀 메시지 보내기
최종욱



가입: 2009년 9월 15일
올린 글: 84

올리기올려짐: 2010년10월20일 22:30    주제: 인용과 함께 답변

정신나간 코너 케이스 몇개 추가

코드:

let x := 0 in
let i := 0 in
for i := 0 to (x := x+1; 10) do
        i := i + 100 ;
write i;
write x;
write -1

(*RESULT : 110 1 -1 *)


코드:
let x := 0 in let i := 0 in let j := 0 in
for i := 0 to (for j := 0 to (i := i+1; 3) do j:=j+4; j) do write i

(* RESULT : 0 1 2 3 4 5 6 7  *)


코드:

(* TRICKY *)
let x := 0 in
( write ((read x) + (read x));
write x )

(* for example, if you input 1 and 2 into standard input, output must be 3 and 2 (the latter) *)


ㅠㅠㅠㅠㅠ
_________________
Jongwook Choi
Seoul National University, School of Computer Science & Engineering
위로
사용자 정보 보기 비밀 메시지 보내기
최종욱



가입: 2009년 9월 15일
올린 글: 84

올리기올려짐: 2010년10월20일 23:11    주제: 인용과 함께 답변

조성근 씀:
위에서 보이는 for문의 동작은 의도된 것이 맞습니다.

K-- 언어의 의미구조는 교과서 81페이지에 나와 있습니다. for문을 위한 의미구조를 보시면 매루프마다 반복자 변수의 값이 처음에 정한 순서대로 할당이 되는 것을 알 수 있습니다.


semantic 이 왜 없나 했더니, 교재에 있었군요 ㅠㅠ

답변 감사합니다!
_________________
Jongwook Choi
Seoul National University, School of Computer Science & Engineering
위로
사용자 정보 보기 비밀 메시지 보내기
박상일



가입: 2009년 9월 27일
올린 글: 13

올리기올려짐: 2010년10월21일 3:49    주제: 인용과 함께 답변

우왕 ㅠㅜ 테스트셋 정말 정신 나갔네요... 이런 걸 다 생각하시다니 정말 대단함.
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2010) 시간대: GMT + 9 시간(한국)
페이지 11

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


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