100 TM(List((WBk, 5), (R, 2), (R, 3), (R, 2), (WOc, 3), |
102 TM(List((WBk, 5), (R, 2), (R, 3), (R, 2), (WOc, 3), |
101 (L, 4), (L, 4), (L, 5), (R, 11), (R, 6), |
103 (L, 4), (L, 4), (L, 5), (R, 11), (R, 6), |
102 (R, 7), (WBk, 6), (R, 7), (R, 8), (WOc, 9), |
104 (R, 7), (WBk, 6), (R, 7), (R, 8), (WOc, 9), |
103 (R, 8), (L, 10), (L, 9), (L, 10), (L, 5), |
105 (R, 8), (L, 10), (L, 9), (L, 10), (L, 5), |
104 (L, 0), (R, 12), (WOc, 13), (L, 14), (R, 12), |
106 (L, 0), (R, 12), (WOc, 13), (L, 14), (R, 12), |
105 (R, 12), (L, 15), (WBk, 14), (R, 0), (L, 15)), new STape(n)) |
107 (R, 12), (L, 15), (WBk, 14), (R, 0), (L, 15))) |
106 |
108 |
107 println((new TMCopy(0)).run) |
109 println("TM: " + (new TMCopy(0)).run(new STape(3))) |
108 |
110 |
|
111 |
|
112 // Abacus |
|
113 abstract class AInst |
|
114 case class Inc(n: Int) extends AInst |
|
115 case class Dec(n: Int, l: Int) extends AInst |
|
116 case class Goto(l: Int) extends AInst |
|
117 |
|
118 type AProg = List[AInst] |
|
119 type Regs = Map[Int, Int] |
|
120 |
|
121 |
|
122 |
|
123 case class AConfig(s: Int, regs: Regs) |
|
124 |
|
125 case class Abacus(p: AProg) { |
|
126 |
|
127 def step(cf: AConfig) : AConfig = (nth_of(p, cf.s), cf.s) match { |
|
128 case (None, _) => cf |
|
129 case (Some(Inc(n)), s) => AConfig(s + 1, cf.regs + (n -> (dget(cf.regs, n) + 1))) |
|
130 case (Some(Dec(n, l)), s) => { |
|
131 if (dget(cf.regs, n) == 0) AConfig(l, cf.regs) |
|
132 else AConfig(s + 1, cf.regs + (n -> (dget(cf.regs, n) - 1))) |
|
133 } |
|
134 case (Some(Goto(l)), _) => AConfig(l, cf.regs) |
|
135 } |
|
136 |
|
137 def steps(cf: AConfig, n: Int) : AConfig = n match { |
|
138 case 0 => cf |
|
139 case n => steps(step(cf), n - 1) |
|
140 } |
|
141 |
|
142 def steps(regs: Regs, n: Int) : AConfig = steps(AConfig(0, regs), n) |
|
143 |
|
144 def run(cf: AConfig) : AConfig = { |
|
145 if (cf.s >= p.length || cf.s < 0) cf else run(step(cf)) |
|
146 } |
|
147 |
|
148 def run(regs: Regs): Regs = run(AConfig(0, regs)).regs |
|
149 } |
|
150 |
|
151 // examples |
|
152 class Copy(in: Int, out: Int) extends |
|
153 Abacus(List(Dec(in, -1), Inc(out), Goto(0))) |
|
154 |
|
155 class Plus(in1: Int, in2: Int, out: Int) extends |
|
156 Abacus(List(Dec(in1, 4), Inc(in2), Inc(out), |
|
157 Goto(0), Dec(out, -1), Inc(in1), Goto(4))) |
|
158 |
|
159 |
|
160 println("Ab: " + (new Plus(0, 1, 2)).run(Map(0 -> 3, 1 -> 4))) |