diff --git a/states.c b/states.c deleted file mode 100644 index 4eda922..0000000 --- a/states.c +++ /dev/null @@ -1,206 +0,0 @@ -#include -#include -#include "const.h" -#include "states.h" - -// States of a Turing Machine that checks whether a number DOESN'T divide another number -// NTS: Check that the first number is smaller? Actually not necessary: see state 2. - -/* -Initially, I defined a triplet, which was what the different states, which are functions returned. - -typedef struct { - - int state; // Finite list of states: initial (0), state 1, state 2, state 3, ..., state 7. - int symbol; // Finite list of symbols: 0,1,2,3,4,5,6,7,8,9 - int movement; // Left = -1, Right =1; - -} ssm; - -But I thought that modifying pointers was easier and more elegant. -*/ - -void state0(int *symbol, int *state, int *movement); -void state1(int *symbol, int *state, int *movement); -void state2(int *symbol, int *state, int *movement); -void state3(int *symbol, int *state, int *movement); -void state4(int *symbol, int *state, int *movement); -void state5(int *symbol, int *state, int *movement); -void state6(int *symbol, int *state, int *movement); -void state7(int *symbol, int *state, int *movement); - -// This function is the delta of which Kozen speaks of in p.210 &ss in Automata and Computability. -void carry_out_step(int *symbol, int *state, int *movement){ // I could make this a bigger if/else tree, but I don't want to. -// Initially, I thought to use https://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work, but this proved unnecessary. - - if(*state==0){ - state0(symbol,state, movement); - } - else if(*state==1){ - // Nótese que los else ifs son necesarios, porque después de state0, *state es =1, pero queremos que se de cuenta en la siguiente vuelta - state1(symbol,state, movement); - } - else if(*state==2){ - state2(symbol,state, movement); - } - else if(*state==3){ - state3(symbol,state, movement); - } - else if(*state==4){ - state4(symbol,state, movement); - } - else if(*state==5){ - state5(symbol,state, movement); - } - else if(*state==6){ - state6(symbol,state, movement); - } - else if(*state==7){ - state7(symbol,state, movement); - } - -} - -void state0(int *symbol, int *state, int *movement){ - if(*symbol ==0){ - *symbol=0; // This is the left endmarker. It isn't changed. This line could be ommited. - *movement= 1; // Move to the right (0 would be to the left). - *state=1; // Change to state 1. - } - - else{ - fprintf(stdout,"\nEn state0, REJECT"); - *state = REJECT; // This is defined as a constant in const.h - // The program ends, because it has unspecified behaviour - } - -} - -void state1(int *symbol, int *state, int *movement){ - if(*symbol ==1){ - *symbol=3; // Another symbol. - *movement= 1; // Move to the right (-1 would be to the left). - *state=2; // Change to state 2. - } - - else{ - fprintf(stdout,"\nEn state1, REJECT"); - *state = REJECT; // This is defined as a constant in const.h - // The program ends, because it has unspecified behaviour - } -} - -void state2(int *symbol, int *state, int *movement){ - - if(*symbol ==2){ - *symbol=4; // You get the idea. - *movement= -1; - *state=3; - } - - else if(*symbol ==9){ - *state=ACCEPT; - fprintf(stdout,"\nIt accepts because the first number doesn't divide the second"); - } - - else{ - *symbol=*symbol; // redundant - *movement= 1; - *state=2; - } -} - -void state3(int *symbol, int *state, int *movement){ - - if(*symbol ==0){ - *symbol=0; - *movement= 1; - *state=4; - } - - else { - *symbol=*symbol; - *movement = -1; - *state= 3; - } -} - -void state4(int *symbol, int *state, int *movement){ - - if(*symbol ==3){ - *symbol=3; - *movement= 1; - *state=4; - } - - else if(*symbol ==1){ - *symbol=1; - *movement= -1; - *state=5; - } - - else if(*symbol ==8){ - *symbol=8; - *movement= 1; - *state=6; - } - - else{ - *state = REJECT; // This is defined as a constant in const.h - // The program ends, because it has unspecified behaviour - } -} - -void state5(int *symbol, int *state, int *movement){ -// This state comes to be because at the end of option symbol ==1 in state 4, I want to stay on the same place, but have to move. - *symbol =*symbol; - *movement = 1; - *state = 1; -} - -void state6(int *symbol, int *state, int *movement){ - - if(*symbol ==2){ - *symbol=4; - *movement=-1; - *state=7; - } - - else if(*symbol ==9){ - *symbol=9; - *movement=-1; - *state = REJECT; - fprintf(stdout,"\nIt rejects because the first number DOES divide the second\n");// The number does divide. - } - - else{ - *symbol = *symbol; - *movement =1; - *state=6; - } - -} - -void state7(int *symbol, int *state, int *movement){ - - if(*symbol ==3){ - *symbol=1; - *movement=-1; - *state=7; - } - - else if(*symbol ==0){ - *symbol=0; - *movement= 1; - *state = 1; - } - - else{ - *symbol = *symbol; - *movement =-1; - *state=7; - } - -} - -