Combinatory Logic Program
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: }





























