home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 19 / AACD19.BIN / AACD / Programming / YAEC / testsrc / Lambda.e < prev    next >
Encoding:
Text File  |  2001-02-23  |  1.7 KB  |  82 lines

  1. /* lambda calc evaluator in E, makes heavy use of unification */
  2.  
  3. -> problems when compiling with yaec.
  4. -> could it be that yaec puts params c-style ?
  5. -> can not find any other reason why it crashes..
  6.  
  7. DEF nchar=97 -> "a"
  8.  
  9. ENUM ATOM,LAMBDA,APP
  10.  
  11. PROC ev(exp)
  12.   DEF par,body,fun,arg
  13.   IF exp <=> [APP,fun,arg]
  14.     funval(fun) <=> [LAMBDA,par,body]
  15.     RETURN ev(replace(body,par,arg))
  16.   ELSE
  17.     RETURN exp
  18.   ENDIF
  19. ENDPROC
  20.  
  21. PROC funval(exp)
  22.   DEF x,y
  23.   IF exp <=> [APP,x,y]
  24.     RETURN funval(ev(exp))
  25.   ELSEIF exp <=> [ATOM,x]
  26.     RETURN funval(getdef(x))
  27.   ELSE
  28.     RETURN exp
  29.   ENDIF
  30. ENDPROC
  31.  
  32. PROC replace(exp,old,new)
  33.   DEF fun,arg,par,body,a,n
  34.   IF exp <=> [APP,fun,arg]
  35.     RETURN NEW [APP,replace(fun,old,new),replace(arg,old,new)]
  36.   ELSEIF exp <=> [ATOM,a]
  37.     RETURN IF a=old THEN new ELSE exp
  38.   ELSEIF exp <=> [LAMBDA,par,body]
  39.     new <=> [ATOM,a]
  40.     IF par=a
  41.       RETURN NEW [LAMBDA,n,replace(replace(body,par,NEW [ATOM,nchar++]),old,new)]
  42.     ELSE
  43.       RETURN NEW [LAMBDA,par,replace(body,old,new)]
  44.     ENDIF
  45.   ENDIF
  46. ENDPROC
  47.  
  48. PROC pretty(exp)
  49.   DEF x,y
  50.   IF exp <=> [APP,x,y]
  51.     pretty(x)
  52.     PutStr(' (')
  53.     pretty(y)
  54.     PutStr(')')
  55.   ELSEIF exp <=> [LAMBDA,x,y]
  56.     PrintF('\\\c.',x)
  57.     pretty(y)
  58.   ELSEIF exp <=> [ATOM,x]
  59.      PrintF('\c',x)
  60.   ENDIF
  61. ENDPROC
  62.  
  63. PROC getdef(a)
  64.   PrintF('getdef\n')
  65.   SELECT a
  66.     CASE "t" ; RETURN [LAMBDA,"x",[LAMBDA,"y",[ATOM,"x"]]]
  67.     CASE "f" ; RETURN [LAMBDA,"x",[LAMBDA,"y",[ATOM,"y"]]]
  68.     DEFAULT ;  Raise(10)
  69.   ENDSELECT
  70. ENDPROC
  71.  
  72. PROC main()
  73.   DEF exp
  74.   exp:=[APP,[APP,[ATOM,"t"],[ATOM,"t"]],[ATOM,"f"]]
  75.   pretty(exp)
  76.   PutStr(' results in ')
  77.   pretty(ev(exp))            -> prints: 't (t) (f) results in t'
  78.   PutStr('\n')
  79. ENDPROC
  80.  
  81.  
  82.