Symbolické programovanie a LISP, zima 2000/2001

(vychádza z prednášky Funkcionálne programovanie, Ivan Kalaš)
Petrovič Pavol, Ústav Informatiky, č.d. 15
e-mail: ppetrovi@dent.ii.fmph.uniba.sk
www k prednáške: http://www.ii.fmph.uniba.sk/vyuka/lisp

2.prednáška

Procedurálna dekompozícia:

sqrt

sqrt-iter

good-enough?

improve

square

abs

average

dekompozícia na zmysluplné znovapoužiteľné úlohy, tzv. čierne skrinky


lokálne mená

[] (define x 5) x
[] (square 7) 49
[] x 5

premenné v good-enough?

hodnota funkcie závisí len na voľných premenných (nie na viazaných)


interné definície

  1. krok
  2. krok - keďže x je viazaná premenná už vo funkcii sqrt, nie je potrebné ju viazať aj v interných definíciách

test prvočísel

  1. klasický spôsob - lineárny čas, konštantný priestor
  2. využitie Malej Fermatovej vety - logaritmický čas, logaritmický priestor

Malá Fermatova veta: Ak n je prvočíslo a a je prirodzené číslo menšie ako n, potom a je kongruentné s a^n mod n.

Ak n nie je prvočíslo, pravdepodobnosť, že a je kongruentné s a^n mod n, je malá. Opakovaním testu times-krát sa pravdepodobnosť chyby zníži (ale nebude nulová).


funkcie ako argumenty

funkcie sum-integer, sum-cube a pi8-sum využívajú rovnaký vzor:

(define (<name> a b)
   (if (> a b)
       0
       (+ (<term> a)
            (<name> (<next> a) b))))
funkcia sum a jej využitie

lambda

konštruktor vytvárajúci funkciu bez mena

formálna definícia

(lambda (<formal-parameters>) <body>)

(define (plus4 x) (+ x 4)) = (define plus4 (lambda (x) (+ x 4)))
(define (<name> <par1> <par2> ...)
           <body>)
= (define <name>
   (lambda (<par1> <par2> ...)
                <body>))

vrátenie výsledku funkcie bez mena

[] ((lambda (x) (+ x 4)) 2)

6

[] ((lambda () 2))

2


let

príklad:

f(x, y) = x (1 + xy)^2 + y (1 - y) + (1 + xy) (1 - y) = ?

zjednodušenie

a = 1 + xy
b = 1 - y
f(x, y) = x a^2 + y b + a b = ?

  1. krok
  2. krok
  3. krok
  4. krok

formálna definícia

(let (<equations>) <body>))

(let ((<var1> <exp1>)
       (<var2> <exp2>)
...................................
       (<varn> <expn>))
   <body>)
((lambda (<var1> ...<varn>)
   <body>)
  <exp1> ... <expn>)

výhody let oproti define

[] (define x 5)

x

[] (* (let ((x 3)) (+ x x)) x)

30

[] (define x 2)

x

[] (let ((x 3) (y (+ x 2))) (* x y))

12


[] (define (id x) x)

id

[] (id 2)

2

[] (id +)

#<proc +>

[] (id (lambda () 2))

#<proc>

[] (define (x) (lambda () 2))

x

[] x

#<proc x>

[] (x)

#<proc>

[] ((x))

2

[] (define (n+ n)
    (lambda (x) (+ x n)))

n+

[] (define 1+ (n+ 1))

1+

[] (1+ 2)

3


Churchove čísla

prirodzené čísla

párne prirodzené čísla

mocniny 2

ľubovoľná iterácia - Churchove čísla

Churchove čísla = objekty (funkcie), ktoré ako argument vyžadujú iteračnú funkciu

Aby sa nemuselo definovať nekonečno čísel, vytvoria sa pomocou indukcie.

Kvôli nasledujúcim matematickým operáciám je výhodné okrem iterujúcej funkcie pridať ako argument aj nulovú hodnotu.

[] (define one (next zero))

one

[] (define two (next one))

two

[] (define three (next two))

three

[] ((three 1+) 0)

3

[] (((plus three two) 1+) 0)

5

[] (((krat three two) 1+) 0)

6

 

Last Updated on 28-Sep-2000
By Petrovic Pavol
E-mail: ppetrovi@dent.ii.fmph.uniba.sk