이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
강호찬
가입: 2019년 9월 12일 올린 글: 24
|
올려짐: 2022년5월6일 22:18 주제: [HW6] 3번 정수곱셈 람다식 질문 |
|
|
안녕하세요 조교님,
컴퓨터공학부 17학번 강호찬입니다.
다음과 같은 식으로 정수곱셈을 해보려고 했는데요,
잘 되지 않아서 질문을 드립니다.
let a = \m.\n.\s.\z.m s (n s z) in
let z = \f.\x.x in
let m = \m.\n.m (a n) z in
let t = \f.\x.fffx in
let t' = \f.\x.ffx in
m t t'
강의자료 5-0.pdf 56쪽 등을 참고해서 작성을 해보았는데요,
a 는 덧셈을 하는 연산자,
m 은 곱셈을 하는 연산자,
z, t, t' 은 각각 0, 3, 2 숫자에 해당하는 람다식입니다.
제가 보기엔 저 식대로는 문제가 없어 보여서 2 * 3의 값인 6에 대항하는 람다식이 나오기를 기대했는데, 입력 람다식을 파싱한 걸 보여주는 (input program) 출력값인
((\m.\n.((m) ((\m.\n.\s.\z.((m) (s)) (((n) (s)) (z))) (n))) (\f.\x.x)) (\f.\x.(((f) (f)) (f)) (x))) (\f.\x.((f) (f)) (x))
를 https://lambdacalc.io/ 에서 돌리면 계산이 끝도 없이 이어지는 것 같습니다.
혹시 정수 곱셈을 하는데 제가 어떤 식을 잘못 썼는지 도움을 주실 수 있을까요?
감사합니다,
강호찬 드림. |
|
위로 |
|
|
이재호 Site Admin
가입: 2022년 3월 6일 올린 글: 126
|
올려짐: 2022년5월7일 15:01 주제: |
|
|
안녕하세요, 조교입니다.
작성하신 코드를 살펴보니, 수를 인코딩할 때 associtivity 때문에 생긴 문제로 생각됩니다.
Left-associativity에 따라서 fffx와 같은 형태로 작성하시면 ((ff)f)x로 처리됩니다.
따라서 f(f(fx))와 같이 직접 괄호를 넣어주시면 됩니다.
언급하신 https://lambdacalc.io 에서도 이와 같이 적용하여 넣어주면 실행이 됩니다.
감사합니다. |
|
위로 |
|
|
강호찬
가입: 2019년 9월 12일 올린 글: 24
|
올려짐: 2022년5월7일 19:13 주제: |
|
|
안녕하세요,
f(f(f(x))) 와 같이 괄호를 써서 right associativity 를 강제하면 정상적으로 계산이 되는 것을 확인했습니다.
그런데, 덧셈 연산 같은 경우는 그러한 괄호가 없어도 연산이 수행되기도 하고,
강좌 슬라이드에도 괄호를 표시하지는 않았는데요,
그럼 슬라이드에서 수를 나타낸 람다식들은 그러한 괄호가 생략된 것으로 보면 되나요??
좀 더 본질적으로, 원래 람다식에서 수를 표현할 때 right assiciativity가 되도록 괄호를 써야 하는 건가요??
감사합니다. |
|
위로 |
|
|
이재호 Site Admin
가입: 2022년 3월 6일 올린 글: 126
|
올려짐: 2022년5월7일 19:40 주제: |
|
|
안녕하세요, 조교입니다.
참고하신 강좌 슬라이드 5-0.pdf의 62쪽에 1+2를 계산하는 예시가 순차적으로 나옵니다.
여기서 보시면 2는 \f.\x.f(fx)와 같이 괄호 표기가 된 것을 보실 수 있습니다.
Application은 left-associative하기 때문에, 처치 인코딩으로 수를 표현할 때는 \f.\x.f(f(...(f x)...))와 같이 괄호를 쳐야 올바른 순서로 application이 진행된다고 보시면 됩니다.
감사합니다. |
|
위로 |
|
|
강호찬
가입: 2019년 9월 12일 올린 글: 24
|
올려짐: 2022년5월8일 16:53 주제: |
|
|
감사합니다!
강호찬 드림. |
|
위로 |
|
|
|