게시판 인덱스

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

람다계산법에 대해 질문드립니다.

 
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2013)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
로파스
Site Admin


가입: 2012년 9월 9일
올린 글: 280

올리기올려짐: 2013년11월9일 3:28    주제: 람다계산법에 대해 질문드립니다. 인용과 함께 답변

강의슬라이드를 보면 람다계산법과 프로그래밍의 비교에서

Evaluation과 reduction이 같은 의미라고 나와있는데요,

eval에서는 \x. e에서 e안에 reduction할 수 있는 텀이 존재한다고 하더라도

그냥 \x. e를 리턴하라는 시맨틱을 갖고있습니다. 하지만 람다계산법에서 add 1 2의

계산과정을 보여주는 슬라이드에서는 e안에서 시행될 수 있는 리덕션에 대해서도

리덕션을 시행하는 것을 볼 수 있습니다. 한가지 걸리는 것은 인풋을 집어넣을때

다른 질문들 중 하나처럼 괄호를 "열심히"치면 원래대로의 결과가 나옵니다만,

이것은 인풋을 넣을때 괄호를 치는 방식에 따라 결과가 달라진다는 얘기인데..

테스트케이스가 들어올 때 주어진 람다식이 괄호에 의존하지 않고 "사람이 판단하기에"

가장 최소의 형태로 갈 수 있도록 코딩해야하나요?? 아니면 테스트케이스에서의 인풋에

괄호가 "열심히"쳐져 있다고 가정해야나하나요?
위로
사용자 정보 보기 비밀 메시지 보내기
강동옥



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

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

괄호를 열심히 친다고 가정해주세요.

테스트도 모호함이 없는 스트링 인풋을 넣겠습니다.


근데 사실 이게 왜 문제인지 잘 모르겠습니다.

파서에 들어오는 인풋은 모호할수 있지만
어차피 인터프리터에 들어오는 인풋은 명확하게 모호함 없이 결정되지 않나요? Rolling Eyes

제가 질문의도를 잘못파악했다면 다시한번 질문해주세요~
위로
사용자 정보 보기 비밀 메시지 보내기
로파스
Site Admin


가입: 2012년 9월 9일
올린 글: 280

올리기올려짐: 2013년11월12일 19:28    주제: 인용과 함께 답변

예를들어 \x. (e1e2)라는 식을 인풋으로 넣었을 때,
테스트케이스를 (\x. e1) e2로 넣으면 제대로 리덕션이 되는 반면,
\x. (e1e2)로 넣으면 리덕션이 되지 않고 바로 끝납니다.
왜냐하면 \x. e-> \x.e라는 시맨틱에 따라야 하기 때문이지요.

이런 케이스에 대해서 괄호를 어떻게 치느냐에 따라 아웃풋이 달라질것이라고

생각되고, 실제로 \x. e -> \x.e라는 시맨틱에 따라 코딩하면 괄호를 어떻게

치느냐에 따라 같은식에서도 리덕션이 되냐 안되냐가 달라집니다.
위로
사용자 정보 보기 비밀 메시지 보내기
강동옥



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

올리기올려짐: 2013년11월12일 19:40    주제: 인용과 함께 답변

하지만 인터프리터에 들어오는 인풋을 결코 모호할수 없으므로 인터프리터를 짤때 괄호를 많이치고 안치고를 고려하실 필요는 없을것 같습니다.

파서는 여러분의 편의를 위해 제공하는것일뿐 입니다.
파서가 없다고 생각하시면 더 편할것 같습니다.

그러니까 인풋을 만들때

let input1 = App ((Id x), (Id y))

이런식으로 만들수 있겠지요.

예를들어
제시하신 두개의 식은 인터프리터 입장에서 완전히 다른 식인것 같습니다.
하나는 app(lam(x,e1),e2)이고 하나는 lam(x,app(e1,e2))이지요.

만일 \x. e1 e2라는 스트링 인풋을 파서에 줬는데 전자를 인터프리터에게 넘겨준다면 그에대해 잘하면 될것이고 후자를 인터프리터에게 넘겨준다면 그에대해서도 잘하면 될 것입니다.


강동옥 가 2013년11월12일 19:43에 수정함, 총 1 번 수정됨
위로
사용자 정보 보기 비밀 메시지 보내기
로파스
Site Admin


가입: 2012년 9월 9일
올린 글: 280

올리기올려짐: 2013년11월12일 19:42    주제: 인용과 함께 답변

또한가지 질문이 있는데요,

substitution을 \x.e에 적용할 때 새로운 변수 x`이 생기게 되는데요,

오켐엘에서 레퍼런스 기능을 이용해서 새로운변수 기능을 구현하게 될것 같은데,

레퍼런스는 정수밖에 저장할 수 없습니다. 레퍼런스가 1일 때 a, 2일때 b등과 같이

매치해준다고 해도, 변수가 최대 몇개까지 사용될지 모르기때문에 좀 애매한 부분이 있는것같습니다.

변수가 최대 몇개까지 쓰인다고 가정하면 될까요?
위로
사용자 정보 보기 비밀 메시지 보내기
강동옥



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

올리기올려짐: 2013년11월12일 19:45    주제: 인용과 함께 답변

레퍼런스는 정수 뿐 아니라 OCaml 내의 모든 자료구조가 다 저장될 수 있습니다.

그렇게 많은 substitution이 필요한 인풋은 들어가지 않겠지만

많이 필요하다고해도 돌아가도록 작성해야 합니다.


혹 string_of_int 함수로 정수를 string으로 변경할수도 있겠네요 Smile
위로
사용자 정보 보기 비밀 메시지 보내기
로파스
Site Admin


가입: 2012년 9월 9일
올린 글: 280

올리기올려짐: 2013년11월12일 21:36    주제: 인용과 함께 답변

튜토리얼 슬라이드에는 let var=ref 0; 로 정수를 저장하는 방법만 나오던데..

리스트나 변수를 저장하려면 어떤 신택스를 써야하는지 알수있을까요??
위로
사용자 정보 보기 비밀 메시지 보내기
강동옥



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

올리기올려짐: 2013년11월12일 22:43    주제: 인용과 함께 답변

string같은경우에는 동일하게

let var = ref "" 이런식으로 하면 됩니다.


리스트를 저장하고 싶으시다면 타입을 명시해주셔야합니다.

int list라면

let var : (int list) ref = ref []

...
var:= [1;2;3];
var:= 0::!var;
...
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2013) 시간대: GMT + 9 시간(한국)
페이지 11

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


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