scala/ex.scala
changeset 195 f06aa4e1c25b
parent 194 fc2a5e9fbb97
child 198 d93cc4295306
equal deleted inserted replaced
194:fc2a5e9fbb97 195:f06aa4e1c25b
     1 import lib._
     1 import lib._
     2 import turing._
     2 import turing._
     3 import abacus._
     3 import abacus._
       
     4 import recs._
     4 import comp1._
     5 import comp1._
       
     6 //import comp2._
     5 
     7 
     6 // Turing machine examples
     8 // Turing machine examples
     7 val TMCopy = TM((WBk, 5), (R, 2), (R, 3), (R, 2), (WOc, 3), 
     9 val TMCopy = TM((WBk, 5), (R, 2), (R, 3), (R, 2), (WOc, 3), 
     8                 (L, 4), (L, 4), (L, 5), (R, 11), (R, 6), 
    10                 (L, 4), (L, 4), (L, 5), (R, 11), (R, 6), 
     9                 (R, 7), (WBk, 6), (R, 7), (R, 8), (WOc, 9), 
    11                 (R, 7), (WBk, 6), (R, 7), (R, 8), (WOc, 9), 
    19 // Abacus machine examples
    21 // Abacus machine examples
    20 def Copy(in: Int, out: Int, jump: Int) = 
    22 def Copy(in: Int, out: Int, jump: Int) = 
    21   Abacus(List(Dec(in, jump), Inc(out), Goto(0))) 
    23   Abacus(List(Dec(in, jump), Inc(out), Goto(0))) 
    22 
    24 
    23 def Plus(m: Int, n: Int, tmp: Int, jump: Int) =
    25 def Plus(m: Int, n: Int, tmp: Int, jump: Int) =
    24   Abacus(List(Dec(m, 4), Inc(n), Inc(tmp), Goto(0), Dec(tmp, jump), Inc(m), Goto(4))) 
    26   Abacus(List(Dec(m, 4), Inc(n), Inc(tmp), Goto(0), Dec(tmp, jump), Inc(m), Goto(4)))
    25 
    27 
    26 def Mult(in1: Int, in2: Int, out: Int, tmp: Int, jump: Int) = 
    28 def Mult(in1: Int, in2: Int, out: Int, tmp: Int, jump: Int) = 
    27   Abacus(List(Dec(in1, jump))) ++ Plus(in2, out, tmp, -1).shift(1, -1).adjust(-1, 0)
    29   Abacus(List(Dec(in1, jump))) ++ Plus(in2, out, tmp, -1).shift(1, -1).adjust(-1, 0)
    28 
    30 
    29 def Expo(in1: Int, in2: Int, out: Int, tmp1: Int, tmp2: Int, jump: Int) = {
    31 def Expo(in1: Int, in2: Int, out: Int, tmp1: Int, tmp2: Int, jump: Int) = {
    42 println("Compiled Copy 3:     " + toTM(Copy(0, 1, Int.MaxValue).p).run(Tape(3,0,0)))
    44 println("Compiled Copy 3:     " + toTM(Copy(0, 1, Int.MaxValue).p).run(Tape(3,0,0)))
    43 println("Compiled Plus 3 + 4: " + toTM(Plus(0, 1, 2, Int.MaxValue).p).run(Tape(3,4,0,0)))
    45 println("Compiled Plus 3 + 4: " + toTM(Plus(0, 1, 2, Int.MaxValue).p).run(Tape(3,4,0,0)))
    44 println("Compiled Mult 3 * 5: " + toTM(Mult(0, 1, 2, 3, Int.MaxValue).p).run(Tape(3,5,0,0)))
    46 println("Compiled Mult 3 * 5: " + toTM(Mult(0, 1, 2, 3, Int.MaxValue).p).run(Tape(3,5,0,0)))
    45 println("Compiled Expo 3 ^ 4: " + toTM(Expo(0, 1, 2, 3, 4, 10000).p).run(Tape(3,4,0,0,0)))
    47 println("Compiled Expo 3 ^ 4: " + toTM(Expo(0, 1, 2, 3, 4, 10000).p).run(Tape(3,4,0,0,0)))
    46 
    48 
       
    49 // Recursive Function examples
       
    50 def arity(f: Rec) = f match {
       
    51   case Z => 1
       
    52   case S => 1
       
    53   case Id(n, _) => n
       
    54   case Cn(n, _, _) => n
       
    55   case Pr(n, _, _) => n + 1
       
    56   case Mn(n, _) => n 
       
    57 }
    47 
    58 
       
    59 val Add = Pr(1, Id(1, 0), Cn(3, S, List(Id(3, 2))))
       
    60 val Mult = Pr(1, Z, Cn(3, Add, List(Id(3, 0), Id(3, 2))))
       
    61 val Pred = Cn(1, Pr(1, Z, Id(3, 1)), List(Id(1, 0), Id(1, 0)))
       
    62 val Minus = Pr(1, Id(1, 0), Cn(3, Pred, List(Id(3, 2))))
       
    63 
       
    64 def Const(n: Int) : Rec = n match {
       
    65   case 0 => Z
       
    66   case n => Cn(1, S, List(Const(n - 1)))
       
    67 }
       
    68 
       
    69 val Sign = Cn(1, Minus, List(Const(1), Cn(1, Minus, List(Const(1), Id(1, 0)))))
       
    70 val Less = Cn(2, Sign, List(Cn(2, Minus, List(Id(2, 1), Id(2, 0)))))
       
    71 val Not = Cn(1, Minus, List(Const(1), Id(1, 0)))
       
    72 val Eq = Cn(2, Minus, List(Cn(2, Const(1), List(Id(2, 0))), 
       
    73            Cn(2, Add, List(Cn(2, Minus, List(Id(2, 0), Id(2, 1))), 
       
    74              Cn(2, Minus, List(Id(2, 1), Id(2, 0)))))))
       
    75 val Conj = Cn(2, Sign, List(Cn(2, Mult, List(Id(2, 0), Id(2, 1)))))
       
    76 val Disj = Cn(2, Sign, List(Cn(2, Add, List(Id(2, 0), Id(2, 1)))))
       
    77 
       
    78 def Nargs(n: Int, m: Int) : List[Rec] = m match {
       
    79   case 0 => Nil
       
    80   case m => Nargs(n, m - 1) ::: List(Id(n, m - 1))
       
    81 }
       
    82 
       
    83 def Sigma(f: Rec) = {
       
    84   val ar = arity(f)  
       
    85   Pr(ar - 1, Cn(ar - 1, f, Nargs(ar - 1, ar - 1) :::
       
    86                     List(Cn(ar - 1, Const(0), List(Id(ar - 1, 0))))), 
       
    87              Cn(ar + 1, Add, List(Id(ar + 1, ar), 
       
    88                     Cn(ar + 1, f, Nargs(ar + 1, ar - 1) :::
       
    89                         List(Cn(ar + 1, S, List(Id(ar + 1, ar - 1))))))))
       
    90 }
       
    91 
       
    92 println("Add 3 4:   " + Add.eval(List(3, 4)))
       
    93 println("Mult 3 4:  " + Mult.eval(List(3, 4)))
       
    94 println("Pred 9:    " + Pred.eval(List(9)))
       
    95 println("Pred 0:    " + Pred.eval(List(0)))
       
    96 println("Minus 6 2: " + Minus.eval(List(6, 2)))
       
    97 println("Minus 6 8: " + Minus.eval(List(6, 8)))
       
    98 println("Const 8:   " + Const(8).eval(List(67)))
       
    99 println("Sign 8:    " + Sign.eval(List(8)))
       
   100 println("Sign 0:    " + Sign.eval(List(0)))
       
   101 println("Less 4 4:  " + Less.eval(List(4, 4)))
       
   102 println("Less 4 6:  " + Less.eval(List(4, 6)))
       
   103 println("Less 6 4:  " + Less.eval(List(6, 4)))
       
   104 println("Not 0:     " + Not.eval(List(0)))
       
   105 println("Not 6:     " + Not.eval(List(6)))
       
   106 println("Eq 4 4:    " + Eq.eval(List(4, 4)))
       
   107 println("Eq 4 6:    " + Eq.eval(List(4, 6)))
       
   108 println("Eq 6 4:    " + Eq.eval(List(6, 4)))
       
   109 println("Conj 0 6:  " + Conj.eval(List(0, 6)))
       
   110 println("Conj 6 4:  " + Conj.eval(List(6, 4)))
       
   111 println("Conj 0 0:  " + Conj.eval(List(0, 0)))
       
   112 println("Disj 0 6:  " + Disj.eval(List(0, 6)))
       
   113 println("Disj 6 4:  " + Disj.eval(List(6, 4)))
       
   114 println("Disj 0 0:  " + Disj.eval(List(0, 0)))
       
   115 //println("Sigma:     " + Sigma(S).eval(List(0,1,2)))
       
   116 //println("Sigma:     " + Sigma(S).eval(List(0,1,2,3,4,5)))
       
   117 
       
   118 
       
   119 val ABCZero = Abacus(List(Goto(1)))
       
   120 val ABCSucc = Plus(0, 1, 2, 7) ++ Abacus(List(Inc(1))).shift(Plus(0, 1, 2, 7).p.length, -1)
       
   121 def ABCId(n: Int, m: Int) = Plus(m, n, n + 1, 7)