게시판 인덱스

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

[숙제 8] Exercise 1 질문드립니다.

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



가입: 2025년 3월 8일
올린 글: 8

올리기올려짐: 2025년6월9일 14:23    주제: [숙제 8] Exercise 1 질문드립니다. 인용과 함께 답변

let-polymorphic type system의 expansive 알고리즘에 궁금점이 있어서 질문드립니다.

expansive(let rec f = fn x => E1 in E2)는 어떻게 처리해야 할까요?

expansive의 목적을 생각하면 seq, letval, letrec은 매우 유사한 구조입니다 따라서 letrec 구문 역시 seq와 letval과 동일한 연산을 할 것이라 생각할 수 있습니다.

수업 자료에 따르면 expansive(\x.E) = false로 처리합니다. 그리고 expansive(let x = E1 in E2) = expansive(E1) OR expansive(E2)로 처리합니다.
expansive(let x = E1 in E2) = expansive(E1) OR expansive(E2)로 처리한 점을 보면 expansive(let rec f = fn x => E1 in E2) = expansive(E1) OR expansive(E2)가 합리적이라고 생각할 수 있습니다. 그리고 expansive(\x.E) = false이기 때문에 expansive(E1)은 항상 false여야 할 것 같습니다. 따라서 expansive(let rec f = fn x => E1 in E2) = false OR expansive(E2) = expansive(E2)이라고 생각합니다.

제가 이 이상으로 정밀한 논리는 모르겠어서 정말로 이 계산이 참인지 확인하기 위해 실험을 통해 sub expression (E1과 E2)에 대해 각각 expansive(E), false, true으로 처리하는 경우의 반례를 찾아서 증명하고자 했습니다. 그 결과, 아직까지 expansive(let rec f = fn x => E1 in E2) = expansive(E2)로 처리했을 때와 expansive(let rec f = fn x => E1 in E2) = false로 처리했을 때, 그 결과가 다른 경우를 찾지 못 했습니다.
E2가 expansive에 무관한게 사실인지 궁금합니다.

느낌으로는 E2가 expansive 연산에 영향이 있어야 할 것 같습니다. 그렇다면 타입 추론 결과가 다른 예제를 알 수 있을까요?


김경준 가 2025년6월9일 23:31에 수정함, 총 1 번 수정됨
위로
사용자 정보 보기 비밀 메시지 보내기
오규혁
Site Admin


가입: 2022년 3월 15일
올린 글: 88

올리기올려짐: 2025년6월9일 16:11    주제: 인용과 함께 답변

안녕하세요,

다음 코드가 예시가 될 수 있을 것 같습니다.

코드:

let
 rec f = fn x => fn y =>
    y
 val g =
 (let rec z = fn k => f 1 in z 0
 end)
in
 (write (g 2);
 write (g true))
end


조교드림
_________________
TA 오규혁
e-mail: ghoh@ropas.snu.ac.kr
위로
사용자 정보 보기 비밀 메시지 보내기
김경준



가입: 2025년 3월 8일
올린 글: 8

올리기올려짐: 2025년6월9일 23:51    주제: 인용과 함께 답변

1단 다형타입이기 때문에 f의 타입 추론이 불가능한 것일까요?
위로
사용자 정보 보기 비밀 메시지 보내기
오규혁
Site Admin


가입: 2022년 3월 15일
올린 글: 88

올리기올려짐: 2025년6월10일 2:10    주제: 인용과 함께 답변

위 식에 대한 타입 추론은 안전하지만 완전하지 않은 예시입니다.

let g = E in E'에서 expansive(E) = true가 되어 g가 다형타입이 아닌 단순 타입이 되게 됩니다.
이때 (g 2), (g true)가 동시에 있으므로 타입 추론이 안됩니다.

만약 expansive (let rec f = fn x => E1 in E2)가 항상 false라면 let g = E in E'에서 expansive(E)가 false가 되어 g가 다형타입(∀ ('a). 'a -> 'a)이 됩니다.
그렇다면 타입 추론이 될 겁니다.

+ f의 타입은 ∀ ('a, 'b). 'a -> 'b -> 'b가 됩니다.
_________________
TA 오규혁
e-mail: ghoh@ropas.snu.ac.kr
위로
사용자 정보 보기 비밀 메시지 보내기
김경준



가입: 2025년 3월 8일
올린 글: 8

올리기올려짐: 2025년6월10일 3:45    주제: 인용과 함께 답변

아, rank는 찾아보니 제가 잘못 이해했네요.

게시판에 공유주신 vscode extension에 의하면 올려주신 코드 예시는 타입추론되지 않아서 타입 추론이 안 되는 상황이 맞나란 생각에 그 이유를 찾아보고자 했고 답글을 남겼습니다.
위로
사용자 정보 보기 비밀 메시지 보내기
김경준



가입: 2025년 3월 8일
올린 글: 8

올리기올려짐: 2025년6월10일 4:44    주제: 인용과 함께 답변

아, 그런데 타입 추론이 되지 않는 게 맞겠네요.
예시의 결과가 제가 생각한 것과 달라서 헷갈렸습니다.

제가 이해하고 생각한 바는 아래와 같습니다.

제 게시글의 논리대로 letrec도 letval과 seq와 동일하게 expansive(E2)를 연산해야 안전합니다. 하지만 작성해주신 예시 코드처럼 안전하지만 완전하지 않은 상황이 발생하여 타입추론이 안 될 수 있는 것이고요.
expansive (let rec f = fn x => E1 in E2)가 항상 false라면 주어진 예시에서는 타입추론이 되지만, 결국 안전하지 못 한 코드가 발생할 수 있습니다.
그래서 찾고자 했던 예시는, false로 처리했을 때 타입추론이 되는 안전하지 못 한 코드였습니다. 타입 추론되는 안전한 경우는 생각하지 못했네요.

그래서 예시를 보고 안전하지만 완전하지 못한 현 상황을 왜 수용해야 하는 지, 직관적인 이유를 찾고자 했습니다. 그리고 Rank가 범인인가 의심했는데 rank를 다시 이해한 바로는 rank는 무관해보이네요
위로
사용자 정보 보기 비밀 메시지 보내기
오규혁
Site Admin


가입: 2022년 3월 15일
올린 글: 88

올리기올려짐: 2025년6월10일 6:48    주제: 인용과 함께 답변

expansive의 목적은 식이 실행 중에 메모리를 할당 받을 것인지 유추하기 위함입니다.

위 예시는 메모리 할당이 없어서 안전한 프로그램입니다.
f와 z에 적절히 메모리 할당을 넣으면 안전하지 않은 프로그램이 될 겁니다.

안전하지만 완전하지 못한 상황이 나오는 이유는 다음과 같습니다.
실행전에 식이 메모리를 할당받을지 정확히 유추하는 것이 힘들기 때문입니다.

좀 더 설명하면 위 예시에서 expansive(E)가 true가 되는 상황은 결국 E1 E2입니다.

E1 E2에 대해서 생각해보면 어떤 함수가 불릴지 알기 위해서는 복잡한 분석이 필요합니다.
이를 피하고 안전하게 타입 추론하기 위해서 무조건 true로 두고 타입 추론을 하게 됩니다.
_________________
TA 오규혁
e-mail: ghoh@ropas.snu.ac.kr
위로
사용자 정보 보기 비밀 메시지 보내기
김경준



가입: 2025년 3월 8일
올린 글: 8

올리기올려짐: 2025년6월10일 10:53    주제: 인용과 함께 답변

빠르고 자세한 답변 감사합니다
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Spring 2025) 시간대: GMT + 9 시간(한국)
페이지 11

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


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