Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ペアノ自然数
- indirect enum N {
- // N + 1
- case S(N)
- // 0
- case Z
- // デバッグ用、ペアノ自然数 -> アラビア数字
- func print() -> Int {
- var selfValue: N = self
- var i: Int = 0
- while true {
- if case .S(let value) = selfValue {
- selfValue = value
- i += 1
- } else {
- return i
- }
- }
- }
- }
- // 足し算の推論規則
- func plus(lhs: N, rhs: N) -> N {
- // 0 + N1 = N1
- if case .Z = lhs {
- return rhs
- // N1 + N2 = N3 -> S(N1) + N2 = S(N3)
- } else if case .S(let value) = lhs {
- return .S(plus(lhs: value, rhs: rhs))
- }
- // 上全ての計算で網羅できるのでここには絶対到達しない
- fatalError()
- }
- plus(lhs: .S(.S(.Z)), rhs: .S(.S(.Z))).print() // 4
- plus(lhs: .S(.S(.Z)), rhs: .S(.Z)).print() // 3
- plus(lhs: .Z, rhs: .Z).print() // 0
- // 掛け算の推論規則
- func times(lhs: N, rhs: N) -> N {
- // 0 * N = 0
- if case .Z = lhs {
- return .Z
- // N1 * N2 = N3 かつ N2 + N3 = N4 ならば S(N1) * N2 = N4
- } else if case .S(let value) = lhs {
- // N2 + ((N1 - 1) + N2) = N4
- return plus(lhs: rhs, rhs: times(lhs: value, rhs: rhs))
- }
- // 上全ての計算で網羅できるのでここには絶対到達しない
- fatalError()
- }
- times(lhs: .S(.S(.Z)), rhs: .S(.S(.Z))).print() // 4
- times(lhs: .S(.S(.Z)), rhs: .S(.S(.S(.Z)))).print() // 6
- times(lhs: .S(.S(.S(.Z))), rhs: .S(.S(.S(.Z)))).print() // 9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement