이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
로파스 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 주제: |
|
|
괄호를 열심히 친다고 가정해주세요.
테스트도 모호함이 없는 스트링 인풋을 넣겠습니다.
근데 사실 이게 왜 문제인지 잘 모르겠습니다.
파서에 들어오는 인풋은 모호할수 있지만
어차피 인터프리터에 들어오는 인풋은 명확하게 모호함 없이 결정되지 않나요?
제가 질문의도를 잘못파악했다면 다시한번 질문해주세요~ |
|
위로 |
|
|
로파스 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으로 변경할수도 있겠네요 |
|
위로 |
|
|
로파스 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;
... |
|
위로 |
|
|
|