示例#1
0
// 计数
void Counter(Tape &t)
{
    Controller c;

    c.AddRule(0, '0', 0, '0', 'R');
    c.AddRule(0, '1', 0, '1', 'R');
    c.AddRule(0, ' ', 1, ' ', 'L');
    c.AddRule(1, '0', 0, '1', 'R');
    c.AddRule(1, '1', 1, '0', 'L');
    c.AddRule(1, ' ', 0, '1', 'R');

    c.Run(t, true);
}
示例#2
0
// 按位取反
void BitwiseFlip(Tape &t)
{
    Controller c;

    // 如果这里看到的是0,那么S1将写1;
    // 如果这里看到的是1,那么S2将写0。
    c.AddRule(0, '0', 1, ' ', 'R');
    c.AddRule(0, '1', 2, ' ', 'R');
    c.AddRule(0, '$', 4, '$', 'S');

    c.AddRule(1, '0', 1, '0', 'R');
    c.AddRule(1, '1', 1, '1', 'R');
    c.AddRule(1, ' ', 3, '1', 'L');
    c.AddRule(1, '$', 1, '$', 'R');

    c.AddRule(2, '0', 2, '0', 'R');
    c.AddRule(2, '1', 2, '1', 'R');
    c.AddRule(2, ' ', 3, '0', 'L');
    c.AddRule(2, '$', 2, '$', 'R');

    // 往回移到数字开头。
    c.AddRule(3, '0', 3, '0', 'L');
    c.AddRule(3, '1', 3, '1', 'L');
    c.AddRule(3, ' ', 0, ' ', 'R');
    c.AddRule(3, '$', 3, '$', 'L');

    c.MarkFinal(4);

    c.Run(t, true);
}
示例#3
0
// 打印交错01串
void ZeroOneString(Tape &t)
{
    Controller c;

    c.AddRule(0, ' ', 1, '0', 'R');
    c.AddRule(1, ' ', 0, '1', 'R');

    c.Run(t, true);
}
示例#4
0
// a<=b?
// 必须同等长度
void Less(Tape &t)
{
    Controller c;

    // 若第一位为0,则去(a)
    // 若第一位为1,则去(b)
    c.AddRule(0, '0', 1, ' ', 'R');
    c.AddRule(0, '1', 4, ' ', 'R');
    c.AddRule(0, '$', 6, ' ', 'R'); // 等于最后也写0

    // (a) 若0,把第二个数的第一位改成$;若1,则确定小于
    c.AddRule(1, '0', 1, '0', 'R');
    c.AddRule(1, '1', 1, '1', 'R');
    c.AddRule(1, '$', 2, '$', 'R');
    c.AddRule(2, '$', 2, '$', 'R');
    c.AddRule(2, '0', 3, '$', 'L');
    c.AddRule(2, '1', 9, ' ', 'R');

    // 移回第一个数开头。
    c.AddRule(3, '0', 3, '0', 'L');
    c.AddRule(3, '1', 3, '1', 'L');
    c.AddRule(3, '$', 3, '$', 'L');
    c.AddRule(3, ' ', 0, ' ', 'R');

    // (b) 如果第二个数的第一位是1继续比较;如果是0,那确定大于
    c.AddRule(4, '0', 4, '0', 'R');
    c.AddRule(4, '1', 4, '1', 'R');
    c.AddRule(4, '$', 5, '$', 'R');
    c.AddRule(5, '$', 5, '$', 'R');
    c.AddRule(5, '0', 6, ' ', 'R');
    c.AddRule(5, '1', 3, '$', 'L');

    // 最后写0
    c.AddRule(6, '0', 6, ' ', 'R');
    c.AddRule(6, '1', 6, ' ', 'R');
    c.AddRule(6, '$', 6, ' ', 'R');
    c.AddRule(6, ' ', 7, '0', 'R');

    // 最后写1
    c.AddRule(9, '0', 9, ' ', 'R');
    c.AddRule(9, '1', 9, ' ', 'R');
    c.AddRule(9, '$', 9, ' ', 'R');
    c.AddRule(9, ' ', 7, '1', 'R');

    //c.AddRule(7, ' ', 8, '$', 'L');
    c.MarkFinal(7);

    c.Run(t, true);
}