Add tasks for all the new languages
This commit is contained in:
parent
9dc3c2bb62
commit
bba7bfd280
13208 changed files with 134745 additions and 0 deletions
152
Task/Universal-Turing-machine/PHL/universal-turing-machine.phl
Normal file
152
Task/Universal-Turing-machine/PHL/universal-turing-machine.phl
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
module turing;
|
||||
|
||||
extern printf;
|
||||
|
||||
struct @Command {
|
||||
field @Integer tape {get:tape,set:stape};
|
||||
field @Integer move {get:move,set:smove};
|
||||
field @Integer next {get:next,set:snext};
|
||||
|
||||
@Command init(@Integer tape, @Integer move, @Integer next) [
|
||||
this.stape(tape);
|
||||
this.smove(move);
|
||||
this.snext(next);
|
||||
return this;
|
||||
]
|
||||
};
|
||||
|
||||
doc 2 dimansional array structure;
|
||||
|
||||
struct @Rules {
|
||||
|
||||
field @Integer maxstates { get: maxstates, set: smaxstates };
|
||||
field @Integer maxvalue { get: maxvalue, set: smaxvalue };
|
||||
|
||||
field @Array<@Array<@Command> > table {get: t, set: st};
|
||||
|
||||
@Rules init(@Integer states, @Integer values)
|
||||
[
|
||||
this.smaxstates(states);
|
||||
this.smaxvalue(values);
|
||||
this.st(new @Array<@Array<@Command> >.init(states));
|
||||
return this;
|
||||
]
|
||||
|
||||
@Void setRule(@Integer state, @Integer tape, @Command command)
|
||||
[
|
||||
if (null == this::t.get(state)) {
|
||||
this::t.set(state, new @Array<@Command>.init(this::maxvalue));
|
||||
}
|
||||
this::t.get(state).set(tape, command);
|
||||
]
|
||||
|
||||
@Command getRule(@Integer state, @Integer tape)
|
||||
[
|
||||
return this::t.get(state).get(tape);
|
||||
]
|
||||
|
||||
};
|
||||
|
||||
@Void emulateTuring(@Rules rules, @Integer start, @Integer stop, @Array<@Integer> tape, @Integer blank) [
|
||||
var tapepointer = 0;
|
||||
var state = start;
|
||||
|
||||
doc output;
|
||||
printf("Tape\tState\n");
|
||||
|
||||
while (state != stop) {
|
||||
doc add more cells to the tape;
|
||||
if (tapepointer == tape::size) tape.add(blank);
|
||||
if (tapepointer == 0-1) { tape = (new @Array<@Integer>..blank).addAll(tape); tapepointer = 0; }
|
||||
|
||||
doc output;
|
||||
for (var i = 0; i < tape::size; i=i+1) {
|
||||
printf("%i", tape.get(i));
|
||||
}
|
||||
printf("\t%i\n", state);
|
||||
for (var i = 0; i < tapepointer; i=i+1) {
|
||||
printf(" ");
|
||||
}
|
||||
printf("^\n");
|
||||
|
||||
doc the value of the current cell;
|
||||
var tapeval = tape.get(tapepointer);
|
||||
|
||||
doc the current state;
|
||||
var command = rules.getRule(state, tapeval);
|
||||
|
||||
tape.set(tapepointer, command::tape);
|
||||
tapepointer = tapepointer + command::move;
|
||||
state = command::next;
|
||||
}
|
||||
|
||||
doc output;
|
||||
for (var i = 0; i < tape::size; i=i+1) {
|
||||
printf("%i", tape.get(i));
|
||||
}
|
||||
printf("\t%i\n", state);
|
||||
for (var i = 0; i < tapepointer; i=i+1) {
|
||||
printf(" ");
|
||||
}
|
||||
printf("^\n");
|
||||
]
|
||||
|
||||
@Integer main [
|
||||
|
||||
doc incrementer;
|
||||
|
||||
doc 2 states, 2 symbols;
|
||||
|
||||
var rules = new @Rules.init(2, 2);
|
||||
|
||||
doc q0, 1 -> 1, right, q0;
|
||||
doc q0, B -> 1, stay, qf;
|
||||
|
||||
rules.setRule(0, 1, new @Command.init(1, 1, 0));
|
||||
rules.setRule(0, 0, new @Command.init(1, 0, 1));
|
||||
|
||||
doc tape = [1, 1, 1];
|
||||
|
||||
var tape = new @Array<@Integer>..1..1..1;
|
||||
|
||||
doc start turing machine;
|
||||
|
||||
emulateTuring(rules, 0, 1, tape, 0);
|
||||
|
||||
doc ---------------------------------------------------;
|
||||
|
||||
doc three state busy beaver;
|
||||
|
||||
doc 4 states, 2 symbols;
|
||||
|
||||
rules = new @Rules.init(4, 2);
|
||||
|
||||
doc a, 0 -> 1, right, b
|
||||
a, 1 -> 1, left, c
|
||||
b, 0 -> 1, left, a
|
||||
b, 1 -> 1, right, b
|
||||
c, 0 -> 1, left, b
|
||||
c, 1 -> 1, stay, halt
|
||||
;
|
||||
|
||||
doc a = 0,
|
||||
b = 1,
|
||||
c = 2,
|
||||
halt = 3;
|
||||
|
||||
rules.setRule(0, 0, new @Command.init(1, 1, 1));
|
||||
rules.setRule(0, 1, new @Command.init(1, 0-1, 2));
|
||||
rules.setRule(1, 0, new @Command.init(1, 0-1, 0));
|
||||
rules.setRule(1, 1, new @Command.init(1, 1, 1));
|
||||
rules.setRule(2, 0, new @Command.init(1, 0-1, 1));
|
||||
rules.setRule(2, 1, new @Command.init(1, 0, 3));
|
||||
|
||||
doc tape = [];
|
||||
|
||||
tape = new @Array<@Integer>;
|
||||
|
||||
doc start turing machine;
|
||||
|
||||
emulateTuring(rules, 0, 3, tape, 0);
|
||||
return 0;
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue