Vorige                       Inhoud                      Volgende
_________________________________________________________________

SASL                    860409          (c) 1986 by ORD-GROUP  47


een  functie  waarin je een argument B kan stoppen.  De  uitkomst
daarvan is een functie waarin je een argument C kan  stoppen.  De
uitkomst daarvan is of B of C al naar gelang de waarde van A.

Al met al zijn we nog niet klaar. Er staat nog steeds een n in de
formule.  Die  n gaan we weghalen met een methode die we  abstra-
heren noemen.

((+ n) 1) Stelt de formule n+1 voor.  De n is hier niet bekend en
moet nog ingevuld worden. Dit schrijven we als volgt:

((+ B L) C 1)

De  L staat voor 'lambda' of leeg.  De B is een zogenaamde combi-
nator en staat tussen de functie en het argument in.  Die L staat
er  om  te zeggen:  'als je deze cel tegen komt en  je  hebt  een
argument  voor mij dan moet je die aan de rechterkant  invullen.'
De  C  is ook een combinator en heeft zo ongeveer  de  betekenis:
'als  je deze cel tegen komt en je hebt een argument dan moet  je
die aan de linkerkant invullen'

((+ B L) C 1) is dus een functie waar 1 argument in moet.  Als je
er  1 argument in stopt dan vertellen de B en de C je waar je hem
moet  invullen.  Het  argument neemt de plaats in van  de  L.  De
ontstane  expressie kunnen we uitrekenen en er komt een meer  dan
het argument uit.

We zullen deze combinatoren nu ook in onze fac invullen:

(                           S                                  )
 (                     C 1)   (        S                      )
  (if B              )         (* B L)   (fac B              )
        (        C 0)                           (        C 1)
	 (= B L)                                 (- B L)

De  S  combinator  vertelt  dat een  argument  aan  beide  kanten
ingevuld moet worden.  Als men een argument neemt en telkens  bij
een  S aan beide kanten,  een B rechts en een C links invult komt
het  argument  precies op die plaatsen terecht waar  de  n  eerst
stond.  Als  we  alles nu netjes achter elkaar zetten krijgen  we
dit:

fac:
(((if B ((= B L) C 0)) C 1) S ((* B L) S (fac B ((- B L) C 1))))

Dit is inderdaad bijna wat er uit de compiler komt.  Voor  mensen
totaal  onleesbaar  maar voor de interpreter  zeer  begrijpelijk.
Merk  op dat we hier het begrip 'faculteit' hebben opgeslagen  en
niet  'de  faculteit  van n is n keer n min 1'.  In  onze  repre-
sentatie komt geen dummy variabele voor.

Merk  op  dat fac wel naar zichzelf  refereert.  Dit  kan  worden
opgelost  door wat gegoochel met combinatoren maar wij hebben een
iets eenvoudigere oplossing.  Elk haakjespaar is een cel in  onze
geheugenrepresentatie en in plaats van 'fac' vullen we gewoon een
pointer  in naar de eerste cel van de definitie van de faculteit.

_________________________________________________________________

Vorige                       Inhoud                      Volgende