Source Code in C
1: 2: #include <stdio.h>
3: #include <stdlib.h> //BIBLIOTHIKES 4: #include <string.h>
5: 6:
7: #define MAX 1000 //MEGISTO MEGETHOS PINAKA APOTHIKEYSHS TOY L-OROU. 8:
9: 10: const char* valid="()\\->"; //symbola anaparastashs l-oron.
11: const char* varbles="abcdefghijklmnopqrstuvwxyz"; //metablites. 12: int mikos; //mikos λ-orou.
13: 14: typedef enum { l_term, var, S, K, I, express} term_type; //Typos l-orou.
15: term_type type; 16:
17: void elegxos_lorou(char lterm[]);//synartisi gia ton elegxo toy l-orou. 18: char* l_abs(char* oros1,char* oros2);//synartisi poy ylopoiei tin synartisi abs.
19: char* comb(char* oros);//synartisi poy ylopoiei tin synartisi comb. 20:
21: 22: void main(/*int *argv,char *argc*/) //Enalaktika gia to perasma tou l-orou san parametro.
23: { 24: char lterm[MAX]; //pinakas apothikeyseis toy l-orou.
25: 26: //if (argv!=2)
27: //{ //Elegxos tis parametrou tou l-orou. 28: //printf("DOSTE SOSTA TON λ-ORO");
29: //} 30: //sscanf("%s",lterm);
31: 32: printf("Doste ton l-oro\n");
33: scanf("%s",<erm); //Diabasma tou l-orou. 34:
35: elegxos_lorou(lterm); //elegxos tou l-orou. 36: printf("Combinatory Logic = %s\n",comb(lterm));
37: 38: }
39: 40:
41: void elegxos_lorou(char lterm[]) //synartisi gia ton elegxo toy l-orou. 42: {
43: 44: int i=0;
45: int vrethikepara,vrethikepark; //metablites gia ton elegxo ton parentheseon 46:
47: vrethikepara=vrethikepark=0;//synolo parenteseon aristeron-deksion 48: mikos=0; //mikos λ-orou.
49: 50:
51: 52: for(i=0;i<MAX;i++) //eyresi mikous tou l-orou.
53: { 54: if(lterm[i]==0)
55: { 56: i=MAX;
57: } 58: mikos+=1;
59: } 60: mikos--;
61: 62: //elegxos λ-oron.
63: for(i=0;i<mikos;i++) 64: {
65: if(strchr(varbles,lterm[i]) || strchr(valid,lterm[i])) 66: {
67: goto a; 68: }
69: else 70: {
71: printf("Doste sosta to l-oro\n"); 72: exit(0);
73: } 74:
75: a:; if(lterm[i]=='\\') 76: {
77: if(lterm[i+2]!='-') 78: {
79: printf("Doste sosta to l-oro\n"); 80: exit(0);
81: } 82: }
83: if(lterm[i]=='-') 84: {
85: if(lterm[i+1]!='>') 86: {
87: printf("Doste sosta to l-oro\n"); 88: exit(0);
89: } 90: }
91: 92: //metrima parentheseon.
93: if(lterm[i]=='(') 94: {
95: vrethikepara+=1; 96: }
97: if(lterm[i]==')') 98: {
99: vrethikepark+=1; 100: }
101: } 102:
103: //elegxos parentheseon. 104: if(vrethikepara!=vrethikepark)
105: { 106: printf("Lathos Parentheseis\n");
107: exit(0); 108: }
109: 110: //eyresi toy typou tou l-orou.
111: if(mikos==1 && strchr(varbles,lterm[0])) 112: {
113: type=var; 114: }
115: else 116: {
117: type=express; 118: for(i=0;i<mikos;i++)
119: { 120: if(lterm[i]=='\\')
121: { 122: type=l_term;
123: } 124: }
125: } 126:
127: //typosi toy typou tou l-orou. 128: switch(type)
129: { 130: case 0:
131: printf("O oros einai l_oros\n"); 132: break;
133: case 1: 134: printf("O oros einai metabliti\n");
135: printf("Dose sosta enan l-oro\n"); 136: exit(0);
137: case 5: 138: printf("O oros einai ekfrasi\n");
139: printf("Dose sosta enan l-oro\n"); 140: exit(0);
141: default: 142: break;
143: } 144: }
145: 146:
147: 148:
149: 150:
151: char* l_abs(char* oros1,char *oros2) //synartisi ylopoihshs tis synartisis abs 152: {
153: int i,j,vrethikepara,vrethikepard; 154: char buffer[1000],buffer1[1000],buffer2[1000],buffer3[1000];
155: char noros2[1000],noros3[1000]; 156: char *final,*final1,*final2;
157: 158: /////////////////////////////////////////////////////////////////////////////////////////////
159: if(strcmp(oros1,oros2)==0 && oros2[1]=='\0') //abs(x,x)=I 160: {
161: return ("I"); 162: }
163: 164: //////////////////////////////////////////////////////////////////////////////////////////////
165: if(strcmp(oros1,oros2)!=0 && oros2[0]!='(' && oros2[1]=='\0' && strchr(varbles,oros2[0])) 166: {
167: strcat(oros2,"K"); 168: buffer[0]=oros2[0];
169: oros2[0]=oros2[1]; 170: oros2[1]=buffer[0];
171: //abs(x,y)=(Ky) 172: buffer[0]=oros2[0];
173: oros2[0]='('; 174: oros2[2]=oros2[1];
175: oros2[1]=buffer[0]; 176: oros2[3]=')';
177: oros2[4]='\0'; 178: return(oros2);
179: } 180:
181: /////////////////////////////////////////////////////////////////////////////////////////////// 182: if((oros2[0]=='K'||oros2[0]=='S'||oros2[0]=='I') && oros2[1]=='\0')
183: { 184: strcat(oros2,"K");
185: buffer[0]=oros2[0]; 186: oros2[0]=oros2[1];
187: oros2[1]=buffer[0]; 188: //abs(x,c)=(Kc) , c=K,S,I
189: buffer[0]=oros2[0]; 190: oros2[0]='(';
191: oros2[2]=oros2[1]; 192: oros2[1]=buffer[0];
193: oros2[3]=')'; 194: oros2[4]='\0';
195: return(oros2); 196: }
197: 198: /////////////////////////////////////////////////////////////////////////////////////////////////
199: 200: if(oros2[1]!='\0')
201: { 202: i=0;
203: vrethikepara=vrethikepard=0; 204: while(oros2[i]!='\0')
205: { 206: if(oros2[i]=='(')
207: { 208: vrethikepara+=1;
209: } 210: if(oros2[i]==')')
211: { 212: vrethikepard+=1;
213: } 214:
215: if((vrethikepara==vrethikepard) && oros2[i+1]=='\0')////////////////////////////////////// 216: {
217: i=0; 218: while(oros2[i+2]!='\0')
219: { 220: noros2[i]=oros2[i+1];
221: i++; 222: }
223: noros2[i]='\0'; 224:
225: final=l_abs(oros1,noros2); 226: //abs(x,(E))=(abs(x,E))
227: i=0; 228: buffer[0]='(';
229: while(final[i]!='\0') 230: {
231: buffer[i+1]=final[i]; 232: i++;
233: } 234: buffer[i+1]=')';
235: buffer[i+2]='\0'; 236: return(buffer); /////////////////////////////////////////////////////////////////////
237: } 238:
239: noros2[i]=oros2[i]; 240: if(vrethikepara==vrethikepard)
241: { 242: noros2[i+1]='\0';
243: goto b; 244: }
245: i++; 246: }
247: 248: b:; j=0;
249: i++; 250: while(oros2[i]!='\0')
251: { 252: noros3[j]=oros2[i];
253: i++; 254: j++;
255: } 256: noros3[j]='\0';
257: 258:
259: final1=l_abs(oros1,noros2); 260: i=0;
261: while(final1[i]!='\0') 262: {
263: buffer2[i]=final1[i]; 264: i++;
265: } 266: buffer2[i]='\0';
267: 268: final2=l_abs(oros1,noros3);
269: 270: buffer3[0]='S';
271: buffer3[1]='\0'; 272: //abs(x,E1E2)=((S abs(x,E1))abs(x,E2))
273: strcat(buffer3,buffer2); 274: //
275: i=0; 276: buffer1[0]='(';
277: while(buffer3[i]!='\0') 278: {
279: buffer1[i+1]=buffer3[i]; 280: i++;
281: } 282: buffer1[i+1]=')';
283: buffer1[i+2]='\0'; 284: //
285: strcat(buffer1,final2); 286:
287: i=0; 288: buffer[0]='(';
289: while(buffer1[i]!='\0') 290: {
291: buffer[i+1]=buffer1[i]; 292: i++;
293: } 294: buffer[i+1]=')';
295: buffer[i+2]='\0'; 296:
297: return(buffer); 298: ///////////////////////////////////////////////////////////////////////////////////////
299: } 300:
301: 302: return("Lathos ston l-oro");
303: 304: }
305: 306:
307: 308: char* comb(char* oros) //Synartisi ylopoihshs tis synartisis comb.
309: { 310: int i,j,vrethikepara,vrethikepard;
311: char *final1,*final2; 312: char noros2[1000],noros3[1000],noros4[1000];
313: char buffer[1000],buffer1[1000]; 314:
315: /////////////////////////////////////////////////////////////////////////////////////// 316: if (strchr(varbles,oros[0]) && oros[1]=='\0')
317: { 318: return oros; //comb(x)=x.
319: } 320:
321: /////////////////////////////////////////////////////////////////////////////////////// 322: if(oros[0]=='(' && oros[1]!='\\' )
323: { 324: i=1;
325: j=vrethikepara=vrethikepard=0; 326: while((oros[i]!=')') || (oros[i+1]!='\0'))
327: { 328: if(oros[i]=='(')
329: { 330: vrethikepara+=1;
331: } 332: if(oros[i]==')')
333: { 334: vrethikepard+=1;
335: } 336: noros2[j]=oros[i];
337: if(vrethikepara==vrethikepard) 338: {
339: noros2[j+1]='\0'; 340: goto d;
341: } 342: i++;
343: j++; 344: } //comb((E1E2))=(comb(E1) comb(E2))
345: d:; j=0; 346: while((oros[i+1]!=')') && (oros[i+2]!='\0'))
347: { 348: noros3[j]=oros[i+1];
349: i++; 350: j++;
351: } 352: noros3[j]='\0';
353: 354: final1=comb(noros2);
355: i=0; 356: while(final1[i]!='\0')
357: { 358: buffer1[i]=final1[i];
359: i++; 360: }
361: buffer1[i]='\0'; 362: final2=comb(noros3);
363: 364: strcat(buffer1,final2);
365: 366: i=0;
367: buffer[0]='('; 368: while(buffer1[i]!='\0')
369: { 370: buffer[i+1]=buffer1[i];
371: i++; 372: }
373: buffer[i+1]=')'; 374: buffer[i+2]='\0';
375: 376: return(buffer);
377: } 378: //////////////////////////////////////////////////////////////////////////////////////////
379: 380: if(oros[0]=='(' && oros[1]=='\\' )
381: { 382: i=5;
383: j=0; 384: while(oros[i+1]!='\0')
385: { 386: noros2[j]=oros[i];
387: i++; 388: j++;
389: } 390: noros2[j]='\0';
391: 392: noros3[0]=oros[2];
393: noros3[1]='\0'; 394: //comb((lx.E))=(abs(x,comb(E)))
395: final1=comb(noros2); 396: i=0;
397: while(final1[i]!='\0') 398: {
399: noros4[i]=final1[i]; 400: i++;
401: } 402: noros4[i]='\0';
403: final2=l_abs(noros3,noros4); 404:
405: i=0; 406: buffer[0]='(';
407: while(final2[i]!='\0') 408: {
409: buffer[i+1]=final2[i]; 410: i++;
411: } 412: buffer[i+1]=')';
413: buffer[i+2]='\0'; 414:
415: return(buffer); 416: }
417: //////////////////////////////////////////////////////////////////////////////////////// 418: return("Lathos ston l-oro");
419: }