Merge from mainline (167278:168000).
[official-gcc/graphite-test-results.git] / gcc / testsuite / go.test / test / peano.go
blobf4c59d1e1a2c64b36fe9674704c085846fa01ce7
1 // $G $F.go && $L $F.$A && ./$A.out
3 // Copyright 2009 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
7 package main
9 type Number *Number
12 // -------------------------------------
13 // Peano primitives
15 func zero() *Number {
16 return nil
20 func is_zero(x *Number) bool {
21 return x == nil
25 func add1(x *Number) *Number {
26 e := new(Number)
27 *e = x
28 return e
32 func sub1(x *Number) *Number {
33 return *x
37 func add(x, y *Number) *Number {
38 if is_zero(y) {
39 return x
42 return add(add1(x), sub1(y))
46 func mul(x, y *Number) *Number {
47 if is_zero(x) || is_zero(y) {
48 return zero()
51 return add(mul(x, sub1(y)), x)
55 func fact(n *Number) *Number {
56 if is_zero(n) {
57 return add1(zero())
60 return mul(fact(sub1(n)), n)
64 // -------------------------------------
65 // Helpers to generate/count Peano integers
67 func gen(n int) *Number {
68 if n > 0 {
69 return add1(gen(n - 1))
72 return zero()
76 func count(x *Number) int {
77 if is_zero(x) {
78 return 0
81 return count(sub1(x)) + 1
85 func check(x *Number, expected int) {
86 var c = count(x)
87 if c != expected {
88 print("error: found ", c, "; expected ", expected, "\n")
89 panic("fail")
94 // -------------------------------------
95 // Test basic functionality
97 func init() {
98 check(zero(), 0)
99 check(add1(zero()), 1)
100 check(gen(10), 10)
102 check(add(gen(3), zero()), 3)
103 check(add(zero(), gen(4)), 4)
104 check(add(gen(3), gen(4)), 7)
106 check(mul(zero(), zero()), 0)
107 check(mul(gen(3), zero()), 0)
108 check(mul(zero(), gen(4)), 0)
109 check(mul(gen(3), add1(zero())), 3)
110 check(mul(add1(zero()), gen(4)), 4)
111 check(mul(gen(3), gen(4)), 12)
113 check(fact(zero()), 1)
114 check(fact(add1(zero())), 1)
115 check(fact(gen(5)), 120)
119 // -------------------------------------
120 // Factorial
122 func main() {
123 for i := 0; i <= 9; i++ {
124 print(i, "! = ", count(fact(gen(i))), "\n")