Advertisement
Guest User

Untitled

a guest
Jul 24th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.60 KB | None | 0 0
  1. // ペアノ自然数
  2. indirect enum N {
  3. // N + 1
  4. case S(N)
  5. // 0
  6. case Z
  7.  
  8. // デバッグ用、ペアノ自然数 -> アラビア数字
  9. func print() -> Int {
  10. var selfValue: N = self
  11. var i: Int = 0
  12.  
  13. while true {
  14. if case .S(let value) = selfValue {
  15. selfValue = value
  16. i += 1
  17. } else {
  18. return i
  19. }
  20. }
  21. }
  22. }
  23.  
  24. // 足し算の推論規則
  25. func plus(lhs: N, rhs: N) -> N {
  26.  
  27. // 0 + N1 = N1
  28. if case .Z = lhs {
  29. return rhs
  30. // N1 + N2 = N3 -> S(N1) + N2 = S(N3)
  31. } else if case .S(let value) = lhs {
  32. return .S(plus(lhs: value, rhs: rhs))
  33. }
  34.  
  35. // 上全ての計算で網羅できるのでここには絶対到達しない
  36. fatalError()
  37. }
  38.  
  39. plus(lhs: .S(.S(.Z)), rhs: .S(.S(.Z))).print() // 4
  40. plus(lhs: .S(.S(.Z)), rhs: .S(.Z)).print() // 3
  41. plus(lhs: .Z, rhs: .Z).print() // 0
  42.  
  43. // 掛け算の推論規則
  44. func times(lhs: N, rhs: N) -> N {
  45.  
  46. // 0 * N = 0
  47. if case .Z = lhs {
  48. return .Z
  49. // N1 * N2 = N3 かつ N2 + N3 = N4 ならば S(N1) * N2 = N4
  50. } else if case .S(let value) = lhs {
  51. // N2 + ((N1 - 1) + N2) = N4
  52. return plus(lhs: rhs, rhs: times(lhs: value, rhs: rhs))
  53. }
  54.  
  55. // 上全ての計算で網羅できるのでここには絶対到達しない
  56. fatalError()
  57. }
  58.  
  59.  
  60. times(lhs: .S(.S(.Z)), rhs: .S(.S(.Z))).print() // 4
  61. times(lhs: .S(.S(.Z)), rhs: .S(.S(.S(.Z)))).print() // 6
  62. times(lhs: .S(.S(.S(.Z))), rhs: .S(.S(.S(.Z)))).print() // 9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement