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
5.cvičenie
- Mobily
Mobil je detská hračka otáčajúca sa okolo osi
pozostávajúca z dvoch ramien. Na každom z ramien
môže byt zavesený další mobil alebo
ukončenie ramena, tzv. rybička. Rybička je celé číslo
určujúce váhu.
Príklad mobilu:
- Zadefinujte interface (selektory a
konštruktory) k mobilu.
(define (urob-mobil L P) ...
(define (L-rameno mobil) ...
(define (P-rameno mobil) ...
- Zadefinujte interface k ramenu mobilu.
(define (urob-rameno dlzka nieco) ...
(define (dlzka rameno) ...
(define (nieco rameno) ...
Oprava!
(define (je-rybicka? nieco) ...
- Zadefinujte unárnu funkciu je-mobil?,
ktorá vráti hodnotu "pravda", ak
vstup m je mobil.
(define (je-mobil? m) ...
- Zadefinujte unárnu funkciu tiaz,
ktorá vráti váhu celého mobilu mobil.
(define (tiaz mobil) ...
- Zadefinujte unárnu funkciu vyvazeny?,
ktorá vráti hodnotu "pravda", ak je
celý mobil mobil
vyvážený (t.j. je vyvážený
každý podmobil).
(define (vyvazeny? mobil) ...
- Zadefinujte binárnu funkciu rovnake?,
ktorá vráti hodnotu "pravda", ak
mobily mobil1 a mobil2
sú rovnaké.
Berte do úvahy aj otáčanie mobilu okolo osi.
(define (rovnake? mobil1 mobil2) ...
- Zadefinujte unárnu funkciu max-polomer,
ktorá vráti maximálny polomer mobilu mobil.
Berte do úvahy aj otáčanie mobilu okolo osi.
(define (max-polomer mobil) ...
- Zadefinujte unárnu funkciu min-polomer,
ktorá vráti minimálny polomer mobilu mobil.
Berte do úvahy aj otáčanie mobilu okolo osi.
(define (min-polomer mobil) ...
- Zadefinujte unárnu funkciu bezpecny?,
ktorá vráti hodnotu "pravda", ak pri
otáčaní mobilu mobil ramená
do seba nenarážajú.
(define (bezpecny? mobil) ...
- Vlastnosti
- Zadefinujte binárnu funkciu s-intersection,
ktorá vráti prienik dvoch množín symbolov
(reprezentovaných zoznamom).
(define (s-intersection s1 s2) ...
- Zadefinujte binárnu funkciu find-supertype,
ktorá vráti dvojicu objektov. Tieto objekty vznikli
transformáciou vstupných parametrov object1
a object2 na
najmenší spoločný nadtyp (pozri piatu prednášku,
aritmetiku nad hierarchiou typov). Využite
tabuľku nadtypov.
(define (find-supertype object1 object2) ...
- Matematické výrazy
Symbolický matematický výraz je:
- číslo (reprezentované číslom),
- premenná (reprezentovaná symbolom),
- súčet, resp. súčin symbolických
matematických výrazov (reprezentovaný
trojprvkovým zoznamom, kde druhý prvok je
symbol '+, resp. '* a prvý a tretí prvok sú
symbolické matematické výrazy).
- Zadefinujte unárnu funkciu my-eval,
ktorá vyhodnotí symbolický matematický výraz
exp bez premenných.
(define (my-eval exp) ...
- Zadefinujte unárnu funkciu my-eval2,
ktorá vyhodnotí symbolický matematický výraz
exp podľa prostredia env,
ktoré obsahuje dvojice premenná - hodnota.
Využite funkciu assoc.
(define (my-eval2 exp env) ...
- Zadefinujte unárnu funkciu inf->pref,
ktorá konvertuje symbolický matematický výraz
exp z infixovej formy do
prefixovej.
(define (inf->pref exp) ...
- Porovnajte vyhodnocovanie symbolických
matematických výrazov pomocou funkcie my-eval
a pomocou kompozície funkcií inf->pref
a eval.
- Symbolické derivovanie
- Zvoľte si symbolickú reprezentáciu matematických výrazov
a zadefinujte k nej interface:
- testy: constant?,
variable?, sum?,
product?
Testy nadobúdajú hodnotu
"pravda", ak ich argument je
matematický výraz zodpovedajúceho
typu.
- selektory: sum-arg1, sum-arg2,
product-arg1, product-arg2
Selektory nadobúdajú hodnotu
prvého, resp. druhého argumentu
matematického výrazu.
- konštruktory: make-sum,
make-product
Konštruktory vytvárajú
matematický výraz zodpovedajúceho
typu.
- Zadefinujte binárnu funkciu derive,
ktorá symbolicky derivuje výraz exp
podľa premennej var
podľa pravidiel:
x' = 1; c' = 0 (c <> x); (u + v)' = u' +
v'; (u * v)' = u * v' + v * u';
(define (derive exp var) ...
- Upravte konštruktory, aby výsledky boli
čo najviac zjednodušené.
Napr: (derive '(* x y) 'x) = y, a nie (+ (* x 0)
(* y 1))
- Upravte reprezentáciu symbolických
matematických výrazov tak, aby obsahovala
goniometrické funkcie sin a cos,
pripojte k existujúcemu interface-u funkcie
pracujúce s týmito symbolickými funkciami a
upravte funkciu derive, aby s
nimi tiež pracovala.
- testy: sin?, cos?
- selektory: sin-arg, cos-arg
- konštruktory: make-sin,
make-cos
- Zadefinujte unárnu funkciu derive-function,
ktorá symbolicky derivuje vopred dané
jednoduché funkcie f. Napr.
(derive-function 'sin) = 'cos.
(define (derive-function f) ...
- Upravte reprezentáciu symbolických
matematických výrazov tak, aby obsahovala
ľubovoľné (vopred dané) funkcie,
aktualizujte existujúci interface a upravte
funkciu derive.
- testy: f?
- selektory: f-arg1, f-arg2,
f-arg3, ...
- konštruktory: make-f
Last Updated on 02-Nov-2000
By Petrovic Pavol
E-mail: ppetrovi@dent.ii.fmph.uniba.sk