| 
			
				|  | 
 
 |  
 
	
		| 이전 주제 보기 :: 다음 주제 보기 |  
		| 글쓴이 | 메시지 |  
		| 윤용호 
 
 
 가입: 2008년 9월 23일
 올린 글: 257
 
 
 | 
			
				|  올려짐: 2009년11월23일 16:31    주제: HW6 testset |   |  
				| 
 |  
				| (* open Lam *) 
 let le1=App (Lam ("x", Var "y"), Lam ("z", Var "z"))
 let le2=Lam("y", App (Lam ("x", Var "y"), Lam ("z", Var "z")))
 let le3=App((Lam ("x", App (Lam ("y", App (Var "y", Var "x")), Var "z"))), App (Var "z", Var "w"))
 let le4=Lam ("z", Lam ("w", App((Lam ("x", App (Lam ("y", App (Var "y", Var "x")), Var "z"))), App (Var "z", Var "w"))))
 let le5=App(Lam ("x", App(Var "x", Var "x")), Lam ("y", App(Var "y", Var "y")))
 let le6=App(Lam ("w", App(Lam ("z", Var "w"), App(Lam ("x", App(Var "x", Var "x")), Lam ("y", App(Var "y", Var "y"))))), Lam ("a", Var "a"))
 let le7=App(Lam ("x", Lam ("a", Lam ("b", App(App(Var "a", Var "x"), App(Var "b", Var "x"))))), Lam("y", Var "y"))
 let le8=App(Lam ("x", Lam ("a", Lam ("b", Lam ("c", App(App(App(Var "a", Var "x"), App(Var "b", Var "x")), App(Var "c", Var "x")))))), Lam ("y", Var "y"))
 let le9=Lam("c", App(App(Var "c", le7), Lam("y'", Var "y'")))
 let l_zero = Lam("f_zero", Lam ("x_zero", Var "x_zero"))
 let l_one = Lam("f_one", Lam ("x_one", App(Var "f_one", Var "x_one")))
 let l_succ = Lam("n", Lam ("f_succ", Lam ("x_succ", App(Var "f_succ", App(App(Var "n", Var "f_succ"), Var "x_succ")))))
 let l_add = Lam ("n1", Lam ("n2", Lam ("f_add", Lam ("x_add", App(App(Var "n1", Var "f_add"), App(App(Var "n2", Var "f_add"), Var "x_add"))))))
 let l_mult = Lam ("n1", Lam ("n2", Lam ("f_mult", App(Var "n1", App(Var "n2", Var "f_mult")))))
 let l_two = App(l_succ, l_one)
 let l_three = App(App(l_add, App(l_succ, (Lam("f_two", Lam ("x_two", App(Var "f_two", Var "x_two")))))), (Lam("f_three", Lam ("x_three", App(Var "f_three", Var "x_three")))))
 let l_six = App(App(l_mult, (Lam ("f_two", Lam("x_two", App(Var "f_two", App(Var "f_two", Var "x_two")))))), (Lam ("f_three", Lam("x_three", App(Var "f_three", App(Var "f_three", App(Var "f_three", Var "x_three")))))))
 let test () = ignore (
 print_endline ">>le2   result : \\(y).y";
 pp le2;
 pp(reduce le2);
 print_newline();print_endline ">>le4   result : \\(z).\\(w).(z (z w))";
 pp le4;
 pp(reduce le4);
 print_newline();print_endline ">>le6(non infinite loop)   result : \\(a).a";
 pp le6;
 pp(reduce le6);
 print_newline();print_endline ">>le7   result : \\(a).\\(b).((a \\(y).y) (b \\(y').y'))";
 pp le7;
 pp(reduce le7);
 print_newline();print_endline ">>le8   result : \\(a).\\(b).\\(c).(((a \\(y).y) (b \\(y').y')) (c \\(y'').y''))";
 pp le8;
 pp(reduce le8);
 print_newline();print_endline ">>le9   result : \\(c).((c \\(a).\\(b).((a \\(y).y) (b \\(y'').y''))) \\(y').y')";
 pp le9;
 pp(reduce le9);
 print_newline();print_endline ">>l_two   result : \\(f_succ).\\(x_succ).(f_succ (f_succ x_succ))";
 pp l_two;
 pp(reduce l_two);
 print_newline();print_endline ">>l_three   result : \\(f_add).\\(x_add).(f_add (f_add (f_add x_add)))";
 pp l_three;
 pp(reduce l_three);
 print_newline();print_endline ">>l_six   result : \\(f_mult).\\(x_two).(f_mult (f_mult (f_mult (f_mult (f_mult (f_mult x_two))))))";
 pp l_six;
 pp(reduce l_six);
 print_newline();print_endline ">>le5(infinite loop)... use \"Ctrl+C\" to halt";
 pp le5;
 pp(reduce le5)
 )
 
 Lam을 open 하고 interpreter에 넣거나
 아예 이 코드를 module 안에 넣으셔도 됩니다.
 (module 안에 넣을 경우는 test()를 호출할수 없으므로 sig에 matching 시키시면 안되구요)
 
 실행은 test () 을 입력합니다. (module에 넣은 경우 Lam.test()가 되겠지요..)
 
 le9 같은 경우 본인 구현에 맞게 적당히 바꾸어 사용하세요.
 저같은 경우 새 이름 만들때 ' 을 붙이게 되어있어서
 x에 \y.y를 대입할 때 외부에 있는 \y'.y'과 일부러 충돌이 일어나게 만들어서 \y''.y'' 이 생성되도록 했습니다.
 _________________
 TA
 
 윤용호 가 2009년11월24일 11:26에 수정함, 총 2 번 수정됨
 |  |  
		| 위로 |  |  
		|  |  
		| 윤용호 
 
 
 가입: 2008년 9월 23일
 올린 글: 257
 
 
 | 
			
				|  올려짐: 2009년11월23일 23:06    주제: 2번 testset |   |  
				| 
 |  
				| (* open Debru *) let de2=L(A(L(N 1), L(N 0)))
 let de4=L(L(A(L(A(L(A(N 0, N 1)), N 2)), A(N 1, N 0))))
 let de5=A(L(A(N 0, N 0)), L(A(N 0, N 0)))
 let de6=A(L(A(L(N 1), A(L(A(N 0, N 0)), L(A(N 0, N 0))))), L(N 0))
 let de7=A(L(L(L(A(A(N 1, N 2), A(N 0, N 2))))), L(N 0))
 let de8=A(L(L(L(L(A(A(A(N 2, N 3), A(N 1, N 3)), A(N 0, N 3)))))), L(N 0))
 let de9=L(A(A(N 0, de7), L(N 0)))
 let d_zero = L(L(N 0))
 let d_one = L(L(A(N 1, N 0)))
 let d_succ = L(L(L(A(N 1, A(A(N 2, N 1), N 0)))))
 let d_add = L(L(L(L(A(A(N 3, N 1), A(A(N 2, N 1), N 0))))))
 let d_mult = L(L(L(A(N 2, A(N 1, N 0)))))
 let d_two = A(d_succ, d_one)
 let d_three = A(A(d_add, d_one), d_two)
 let d_four = A(A(d_mult, d_two), d_two)
 let d_five = A(A(d_add, d_three), d_two)
 let d_six = A(A(d_mult, d_two), d_three)
 
 let test() = ignore(
 print_endline ">>de2   result : L.0";
 pp de2;
 pp(reduce de2);
 print_newline();print_endline ">>de4   result : L.L.(1 (1 0))";
 pp de4;
 pp(reduce de4);
 print_newline();print_endline ">>de6   result : L.0";
 pp de6;
 pp(reduce de6);
 print_newline();print_endline ">>de7   result : L.L.((1 L.0) (0 L.0))";
 pp de7;
 pp(reduce de7);
 print_newline();print_endline ">>de8   result : L.L.L.(((2 L.0) (1 L.0)) (0 L.0))";
 pp de8;
 pp(reduce de8);
 print_newline();print_endline ">>de9   result : L.((0 L.L.((1 L.0) (0 L.0))) L.0)";
 pp de9;
 pp(reduce de9);
 print_newline();print_endline ">>d_two   result : L.L.(1 (1 0))";
 pp d_two;
 pp(reduce d_two);
 print_newline();print_endline ">>d_three   result : L.L.(1 (1 (1 0)))";
 pp d_three;
 pp(reduce d_three);
 print_newline();print_endline ">>d_four   result : L.L.(1 (1 (1 (1 0))))";
 pp d_four;
 pp(reduce d_four);
 print_newline();print_endline ">>d_five   result : L.L.(1 (1 (1 (1 (1 0)))))";
 pp d_five;
 pp(reduce d_five);
 print_newline();print_endline ">>d_six   result : L.L.(1 (1 (1 (1 (1 (1 0))))))";
 pp d_six;
 pp(reduce d_six);
 print_newline();print_endline ">>de5(infinite loop)... use \"Ctrl+C\" to halt";
 pp de5;
 pp(reduce de5)
 )
 
 사용법은 1번 testset과 동일합니다.
 대부분의 testset이 1번 testset을 그대로 Debru 로 옮긴 것들입니다.
 
 덧붙여 테스트셋들에 대한 약간의 해설을 하자면
 e5같은 경우 대표적인 "무한히 도는 lambda식" 이고
 zero, one, succ, add, mult 등의 경우 lambda로 encoding 된 자연수 표현입니다. \f.\x.((f^n) x) 로 인코딩되어 있습니다.(f의 등장횟수가 수를 나타냅니다)
 
 그밖에도 true, false, pair, if-then-else 등이 모두 lambda로 인코딩 가능하지만
 우리가 받은 lambda expression의 스펙이 이름이 겹치는걸 허용하지 않아
 그것들을 이용한 의미있는 테스트셋을 만들기 어렵더군요.
 _________________
 TA
 |  |  
		| 위로 |  |  
		|  |  
		| 윤용호 
 
 
 가입: 2008년 9월 23일
 올린 글: 257
 
 
 | 
			
				|  올려짐: 2009년11월24일 11:28    주제: 3번 testset |   |  
				| 
 |  
				| module T = Trans (Lam) (Debru) 
 let le1=Lam.App (Lam.Lam ("x", Lam.Var "y"), Lam.Lam ("z", Lam.Var "z"))
 let le2=Lam.Lam("y", Lam.App (Lam.Lam ("x", Lam.Var "y"), Lam.Lam ("z", Lam.Var "z")))
 let le3=Lam.App((Lam.Lam ("x", Lam.App (Lam.Lam ("y", Lam.App (Lam.Var "y", Lam.Var "x")), Lam.Var "z"))), Lam.App (Lam.Var "z", Lam.Var "w"))
 let le4=Lam.Lam ("z", Lam.Lam ("w", Lam.App((Lam.Lam ("x", Lam.App (Lam.Lam ("y", Lam.App (Lam.Var "y", Lam.Var "x")), Lam.Var "z"))), Lam.App (Lam.Var "z", Lam.Var "w"))))
 let le5=Lam.App(Lam.Lam ("x", Lam.App(Lam.Var "x", Lam.Var "x")), Lam.Lam ("y", Lam.App(Lam.Var "y", Lam.Var "y")))
 let le6=Lam.App(Lam.Lam ("w", Lam.App(Lam.Lam ("z", Lam.Var "w"), Lam.App(Lam.Lam ("x", Lam.App(Lam.Var "x", Lam.Var "x")), Lam.Lam ("y", Lam.App(Lam.Var "y", Lam.Var "y"))))), Lam.Lam ("a", Lam.Var "a"))
 let le7=Lam.App(Lam.Lam ("x", Lam.Lam ("a", Lam.Lam ("b", Lam.App(Lam.App(Lam.Var "a", Lam.Var "x"), Lam.App(Lam.Var "b", Lam.Var "x"))))), Lam.Lam("y", Lam.Var "y"))
 let le8=Lam.App(Lam.Lam ("x", Lam.Lam ("a", Lam.Lam ("b", Lam.Lam ("c", Lam.App(Lam.App(Lam.App(Lam.Var "a", Lam.Var "x"), Lam.App(Lam.Var "b", Lam.Var "x")), Lam.App(Lam.Var "c", Lam.Var "x")))))), Lam.Lam ("y", Lam.Var "y"))
 let le9=Lam.Lam("c", Lam.App(Lam.App(Lam.Var "c", le7), Lam.Lam("y'", Lam.Var "y'")))
 let l_zero = Lam.Lam("f_zero", Lam.Lam ("x_zero", Lam.Var "x_zero"))
 let l_one = Lam.Lam("f_one", Lam.Lam ("x_one", Lam.App(Lam.Var "f_one", Lam.Var "x_one")))
 let l_succ = Lam.Lam("n", Lam.Lam ("f_succ", Lam.Lam ("x_succ", Lam.App(Lam.Var "f_succ", Lam.App(Lam.App(Lam.Var "n", Lam.Var "f_succ"), Lam.Var "x_succ")))))
 let l_add = Lam.Lam ("n1", Lam.Lam ("n2", Lam.Lam ("f_add", Lam.Lam ("x_add", Lam.App(Lam.App(Lam.Var "n1", Lam.Var "f_add"), Lam.App(Lam.App(Lam.Var "n2", Lam.Var "f_add"), Lam.Var "x_add"))))))
 let l_mult = Lam.Lam ("n1", Lam.Lam ("n2", Lam.Lam ("f_mult", Lam.App(Lam.Var "n1", Lam.App(Lam.Var "n2", Lam.Var "f_mult")))))
 let l_two = Lam.App(l_succ, l_one)
 let l_three = Lam.App(Lam.App(l_add, Lam.App(l_succ, (Lam.Lam("f_two", Lam.Lam ("x_two", Lam.App(Lam.Var "f_two", Lam.Var "x_two")))))), (Lam.Lam("f_three", Lam.Lam ("x_three", Lam.App(Lam.Var "f_three", Lam.Var "x_three")))))
 let l_six = Lam.App(Lam.App(l_mult, (Lam.Lam ("f_two", Lam.Lam("x_two", Lam.App(Lam.Var "f_two", Lam.App(Lam.Var "f_two", Lam.Var "x_two")))))), (Lam.Lam ("f_three", Lam.Lam("x_three", Lam.App(Lam.Var "f_three", Lam.App(Lam.Var "f_three", Lam.App(Lam.Var "f_three", Lam.Var "x_three")))))))
 
 let de2=Debru.L(Debru.A(Debru.L(Debru.N 1), Debru.L(Debru.N 0)))
 let de4=Debru.L(Debru.L(Debru.A(Debru.L(Debru.A(Debru.L(Debru.A(Debru.N 0, Debru.N 1)), Debru.N 2)), Debru.A(Debru.N 1, Debru.N 0))))
 let de5=Debru.A(Debru.L(Debru.A(Debru.N 0, Debru.N 0)), Debru.L(Debru.A(Debru.N 0, Debru.N 0)))
 let de6=Debru.A(Debru.L(Debru.A(Debru.L(Debru.N 1), Debru.A(Debru.L(Debru.A(Debru.N 0, Debru.N 0)), Debru.L(Debru.A(Debru.N 0, Debru.N 0))))), Debru.L(Debru.N 0))
 let de7=Debru.A(Debru.L(Debru.L(Debru.L(Debru.A(Debru.A(Debru.N 1, Debru.N 2), Debru.A(Debru.N 0, Debru.N 2))))), Debru.L(Debru.N 0))
 let de8=Debru.A(Debru.L(Debru.L(Debru.L(Debru.L(Debru.A(Debru.A(Debru.A(Debru.N 2, Debru.N 3), Debru.A(Debru.N 1, Debru.N 3)), Debru.A(Debru.N 0, Debru.N 3)))))), Debru.L(Debru.N 0))
 let de9=Debru.L(Debru.A(Debru.A(Debru.N 0, de7), Debru.L(Debru.N 0)))
 let d_zero = Debru.L(Debru.L(Debru.N 0))
 let d_one = Debru.L(Debru.L(Debru.A(Debru.N 1, Debru.N 0)))
 let d_succ = Debru.L(Debru.L(Debru.L(Debru.A(Debru.N 1, Debru.A(Debru.A(Debru.N 2, Debru.N 1), Debru.N 0)))))
 let d_add = Debru.L(Debru.L(Debru.L(Debru.L(Debru.A(Debru.A(Debru.N 3, Debru.N 1), Debru.A(Debru.A(Debru.N 2, Debru.N 1), Debru.N 0))))))
 let d_mult = Debru.L(Debru.L(Debru.L(Debru.A(Debru.N 2, Debru.A(Debru.N 1, Debru.N 0)))))
 let d_two = Debru.A(d_succ, d_one)
 let d_three = Debru.A(Debru.A(d_add, d_one), d_two)
 let d_four = Debru.A(Debru.A(d_mult, d_two), d_two)
 let d_five = Debru.A(Debru.A(d_add, d_three), d_two)
 let d_six = Debru.A(Debru.A(d_mult, d_two), d_three)
 
 let _ = ignore (
 print_endline "/**************transl2d test***************/";
 print_endline ">> de2=trans(le2) & original de2";
 Debru.pp (T.transl2d le2);
 Debru.pp de2;
 print_newline();print_endline ">> de4=trans(le4) & original de4";
 Debru.pp (T.transl2d le4);
 Debru.pp de4;
 print_newline();print_endline ">> de5=trans(le5) & original de5";
 Debru.pp (T.transl2d le5);
 Debru.pp de5;
 print_newline();print_endline ">> de6=trans(le6) & original de6";
 Debru.pp (T.transl2d le6);
 Debru.pp de6;
 print_newline();print_endline ">> de7=trans(le7) & original de7";
 Debru.pp (T.transl2d le7);
 Debru.pp de7;
 print_newline();print_endline ">> de8=trans(le8) & original de8";
 Debru.pp (T.transl2d le8);
 Debru.pp de8;
 print_newline();print_endline ">> de9=trans(le9) & original de9";
 Debru.pp (T.transl2d le9);
 Debru.pp de9;
 print_newline();print_endline "/**************transd2l test***************/";
 print_endline ">> transl2d(reduce(transd2l(de2))) & reduce(de2)";
 Lam.pp (T.transd2l de2);
 Lam.pp le2;
 Debru.pp (T.transl2d (Lam.reduce (T.transd2l de2)));
 Debru.pp (Debru.reduce de2);
 print_newline();print_endline ">> transl2d(reduce(transd2l(de4))) & reduce(de4)";
 Lam.pp (T.transd2l de4);
 Lam.pp le4;
 Debru.pp (T.transl2d (Lam.reduce (T.transd2l de4)));
 Debru.pp (Debru.reduce de4);
 print_newline();print_endline ">> transd2l(de5) & le5";
 Lam.pp (T.transd2l de5);
 Lam.pp le5;
 print_newline();print_endline ">> transl2d(reduce(transd2l(de6))) & reduce(de6)";
 Lam.pp (T.transd2l de6);
 Lam.pp le6;
 Debru.pp (T.transl2d (Lam.reduce (T.transd2l de6)));
 Debru.pp (Debru.reduce de6);
 print_newline();print_endline ">> transl2d(reduce(transd2l(de7))) & reduce(de7)";
 Lam.pp (T.transd2l de7);
 Lam.pp le7;
 Debru.pp (T.transl2d (Lam.reduce (T.transd2l de7)));
 Debru.pp (Debru.reduce de7);
 print_newline();print_endline ">> transl2d(reduce(transd2l(de8))) & reduce(de8)";
 Lam.pp (T.transd2l de8);
 Lam.pp le8;
 Debru.pp (T.transl2d (Lam.reduce (T.transd2l de8)));
 Debru.pp (Debru.reduce de8);
 print_newline();print_endline ">> transl2d(reduce(transd2l(de9))) & reduce(de9)";
 Lam.pp (T.transd2l de9);
 Lam.pp le9;
 Debru.pp (T.transl2d (Lam.reduce (T.transd2l de9)));
 Debru.pp (Debru.reduce de9))
 
 
 
 이번엔 3번 숙제 파일 맨 뒤에 이 내용을 붙인 후
 
 ocaml 6_3.ml
 과 같이 한번에 실행합니다. 실행 결과는 아래와 같습니다.
 transd2l의 경우 1번과 2번의 reduce가 정확히 작성되어있지 않으면 제대로 테스트 할 수 없습니다. (transd2l은 유일한 결과를 내지 않으니 각자의 구현에 따라 결과가 다를 것입니다)
 
 /**************transl2d test***************/
 >> de2=trans(le2) & original de2
 L.(L.1 L.0)
 L.(L.1 L.0)
 
 >> de4=trans(le4) & original de4
 L.L.(L.(L.(0 1) 2) (1 0))
 L.L.(L.(L.(0 1) 2) (1 0))
 
 >> de5=trans(le5) & original de5
 (L.(0 0) L.(0 0))
 (L.(0 0) L.(0 0))
 
 >> de6=trans(le6) & original de6
 (L.(L.1 (L.(0 0) L.(0 0))) L.0)
 (L.(L.1 (L.(0 0) L.(0 0))) L.0)
 
 >> de7=trans(le7) & original de7
 (L.L.L.((1 2) (0 2)) L.0)
 (L.L.L.((1 2) (0 2)) L.0)
 
 >> de8=trans(le8) & original de8
 (L.L.L.L.(((2 3) (1 3)) (0 3)) L.0)
 (L.L.L.L.(((2 3) (1 3)) (0 3)) L.0)
 
 >> de9=trans(le9) & original de9
 L.((0 (L.L.L.((1 2) (0 2)) L.0)) L.0)
 L.((0 (L.L.L.((1 2) (0 2)) L.0)) L.0)
 
 /**************transd2l test***************/
 >> transl2d(reduce(transd2l(de2))) & reduce(de2)
 \(a).(\(c).a \(b).b)
 \(y).(\(x).y \(z).z)
 L.0
 L.0
 
 >> transl2d(reduce(transd2l(de4))) & reduce(de4)
 \(a).\(b).(\(c).(\(d).(d c) a) (a b))
 \(z).\(w).(\(x).(\(y).(y x) z) (z w))
 L.L.(1 (1 0))
 L.L.(1 (1 0))
 
 >> transd2l(de5) & le5
 (\(b).(b b) \(a).(a a))
 (\(x).(x x) \(y).(y y))
 
 >> transl2d(reduce(transd2l(de6))) & reduce(de6)
 (\(b).(\(e).b (\(d).(d d) \(c).(c c))) \(a).a)
 (\(w).(\(z).w (\(x).(x x) \(y).(y y))) \(a).a)
 L.0
 L.0
 
 >> transl2d(reduce(transd2l(de7))) & reduce(de7)
 (\(b).\(c).\(d).((c b) (d b)) \(a).a)
 (\(x).\(a).\(b).((a x) (b x)) \(y).y)
 L.L.((1 L.0) (0 L.0))
 L.L.((1 L.0) (0 L.0))
 
 >> transl2d(reduce(transd2l(de8))) & reduce(de8)
 (\(b).\(c).\(d).\(e).(((c b) (d b)) (e b)) \(a).a)
 (\(x).\(a).\(b).\(c).(((a x) (b x)) (c x)) \(y).y)
 L.L.L.(((2 L.0) (1 L.0)) (0 L.0))
 L.L.L.(((2 L.0) (1 L.0)) (0 L.0))
 
 >> transl2d(reduce(transd2l(de9))) & reduce(de9)
 \(a).((a (\(d).\(e).\(f).((e d) (f d)) \(c).c)) \(b).b)
 \(c).((c (\(x).\(a).\(b).((a x) (b x)) \(y).y)) \(y').y')
 L.((0 L.L.((1 L.0) (0 L.0))) L.0)
 L.((0 L.L.((1 L.0) (0 L.0))) L.0)
 _________________
 TA
 |  |  
		| 위로 |  |  
		|  |  
		| 임창원 
 
 
 가입: 2009년 9월 14일
 올린 글: 21
 
 
 | 
			
				|  올려짐: 2009년11월25일 21:21    주제: |   |  
				| 
 |  
				| 언제나 감사드려요 ㅎㅎ |  |  
		| 위로 |  |  
		|  |  
		|  |  
  
	| 
 
 | 새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다
 주제를 수정할 수 없습니다
 올린 글을 삭제할 수 없습니다
 투표를 할 수 없습니다
 
 |  
 Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
 Translated by kss & drssay
 |