From b21ded727b0def0a8027b560b6c9b25028bb46e9 Mon Sep 17 00:00:00 2001 From: Lio Novelli Date: Mon, 10 Jun 2024 01:04:10 +0200 Subject: [PATCH] Drugo poglavje 2.1 - lio. --- zapiski/sicp-lio.html | 631 +++++++++++++++++++++++++++++++++++------- zapiski/sicp-lio.org | 274 +++++++++++++++++- 2 files changed, 797 insertions(+), 108 deletions(-) diff --git a/zapiski/sicp-lio.html b/zapiski/sicp-lio.html index 54a0cf4..6e9d30b 100644 --- a/zapiski/sicp-lio.html +++ b/zapiski/sicp-lio.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Structure and Interpretation of Computer Programs @@ -201,47 +201,58 @@

Table of Contents

-
-

1. Foreword and Preface

-
+
+

Foreword and Preface

+

Lisp je preživeli, v uporabi je že "polovico stoletja". @@ -282,13 +293,13 @@ ukvarjanje s pojmovanjem "kako".

-
-

2. 1. Grajenje abstrakcij s procedurami

-
+
+

1. Grajenje abstrakcij s procedurami

+
-
-

2.1. Elementi programiranja

-
+
+

1.1. Elementi programiranja

+
Primitivni izrazi
predstavtljajo najpreprostejše gradnike (entitete) programskega jezika
@@ -300,9 +311,9 @@ omogočajo upravljanje z njimii kot enotami
-
-

2.2. Izvajanje kombinacij(e)

-
+
+

1.2. Izvajanje kombinacij(e)

+

Postopek za izvajanje kombinacij:

@@ -343,9 +354,9 @@ oblika.
-
-

2.3. 1.1.4 Sestavljene procedure

-
+
+

1.3. 1.1.4 Sestavljene procedure

+
  • Številke in aritmetične operacije so primitivni podatki in procedure.
  • Gnezdenje kombinacij omogoča način za združevanje operacij.
  • @@ -363,9 +374,9 @@ abstrakcije.
-
-

2.4. 1.1.5 Substitucijski model za izvajanje procedur

-
+
+

1.4. 1.1.5 Substitucijski model za izvajanje procedur

+

Za izvajanje sestavljenih procedur z argumenti, izvedeš telo procedure z vsakim formalnim parametrom, ki ga nadomestiš s pripadajočim argumentom. @@ -393,9 +404,9 @@ izraza, ki vsebuje zgolj primitivne izraze in potem izvedi (vso) evalvacijo. -

-

2.5. meta

-
+
+

1.5. meta

+

Linki: https://develop.spacemacs.org/layers/+lang/scheme/README.html @@ -410,9 +421,9 @@ Kako nastavit spacemacs, in malo o guile-u.

-
-

2.5.1. video lekcije

-
+
+

1.5.1. video lekcije

+

https://yewtu.be/channel/UCEBb1b_L6zDS3xTUrIALZOw (6.001 SICP: Structure and Interpretation of Computer Programs (2004)) https://yewtu.be/playlist?list=PL7BcsI5ueSNFPCEisbaoQ0kXIDX9rR5FF (MIT 6.001 Structure and Interpretation, 1986) @@ -421,17 +432,17 @@ Kako nastavit spacemacs, in malo o guile-u.

-
-

2.6. vaje

-
+
+

1.6. vaje

+
-
-

2.6.1. 1.3

-
+
+

1.6.1. 1.3

+
    -
  1. najprej narobe
    -
    +
  2. najprej narobe
    +

    Define a procedure that takes three numbers as arguments and returns the sum of the squares of the two larger numbers. @@ -461,8 +472,8 @@ the squares of the two larger numbers.

  3. -
  4. pravilno
    -
    +
  5. pravilno
    +
    (define (sum-squares-of-larger x y z)
       (if (> x y)
    @@ -484,9 +495,9 @@ the squares of the two larger numbers.
     
-
-

2.6.2. 1.5

-
+
+

1.6.2. 1.5

+

Aplikativni vrstni red: pade takoj v neskoncno zanko. Normalni vrstni red: izvrsi test in pride v if, ki ne izvrsi drugega dela. @@ -494,18 +505,18 @@ Normalni vrstni red: izvrsi test in pride v if, ki ne izvrsi drugega dela.

-
-

2.6.3. 1.6

-
+
+

1.6.3. 1.6

+
-
-

2.6.4. 1.7

-
+
+

1.6.4. 1.7

+
  • good-enough? ni vredu za iskanje korenov majhnih stevil.
  • pravtako za zelo velika stevila
  • @@ -519,9 +530,9 @@ dovolj majhne in takrat prekini funkcijo.
-
-

2.6.5. 1.8

-
+
+

1.6.5. 1.8

+

// Glej v sqrt-newton.sqm

@@ -529,9 +540,9 @@ dovolj majhne in takrat prekini funkcijo.
-
-

2.7. 1.1.8 Procedure kot crne skatle abstrakcij

-
+
+

1.7. 1.1.8 Procedure kot crne skatle abstrakcij

+
  • block structure
  • lexical scoping
  • @@ -539,17 +550,21 @@ dovolj majhne in takrat prekini funkcijo.
-
-

2.8. 1.2.2 Drevesna rekurzija

+
+

1.8. 1.2.2 Drevesna rekurzija

-
-

2.9. 1.2.3 Redi rasti

+
+

1.9. 1.2.3 Redi rasti

-
-

2.10. 1.2.4 Eksponentna funkcija

-
+
+

1.10. 1.2.4 Eksponentna funkcija

+
+

+Tukaj se naucimu successive squaring, ki potem se veckrat prav pride. +

+

#name: exponent

@@ -633,31 +648,68 @@ dovolj majhne in takrat prekini funkcijo. (else (fast-multi-iter a (- b 1) (+ s a))) ) ) + +;; excercise 1.19 - fast fibnonachi +(define (fast-fibo n) + (fast-fibo-iter 1 0 0 1 n) + ) +(define (fast-fibo-iter a b p q count) + (cond ((= count 0) b) + ((even? count) + (fast-fibo-iter + a + b + (+ (* p p) (* q q)) + (+ (* q q) (* 2 p q)) + (/ count 2) + ) + ) + (else (fast-fibo-iter + (+ (* b q) (* a q) (* a p)) + (+ (* b p) (* a q)) + p + q + (- count 1) + )) + ) + ) +;; p' = q^2 + 2pq +;; p' = p^2 + q^2 +(define (slow-fibo n) + (cond ((= n 0) 0) + ((= n 1) 1) + (else (+ + (slow-fibo (- n 1)) + (slow-fibo (- n 2)) + )) + ) + ) +;; melje melje in melje . fast-fibo iypljune takoj
-
-

2.11. 1.2.5 Najvecji skupni deljitel

+
+

1.11. 1.2.5 Najvecji skupni deljitel

-
-

2.12. 1.2.6 Primer: Iskanje prastevil

+
+

1.12. 1.2.6 Primer: Iskanje prastevil

-
-

2.13. 1.3 Sestavljanje abstrakcij s procedurami visjega reda

-
+
+

1.13. 1.3 Sestavljanje abstrakcij s procedurami visjega reda

+

Procedure, ki spreminjajo druge procedure se imenujejo procedure višjega reda.

-
-

2.14. 1.3.1 Procedure kot argumenti

-
+
+

1.14. 1.3.1 Procedure kot argumenti

+

Primer vsote.

@@ -796,19 +848,93 @@ Primer vsote. pribl-pi-next n )) + +;; excercise 1.32 +;; recursive accumulate +(define (accumulate-r combiner null-val term a next b) +;; combiner is a procedure of two arguments. + (if (> a b) + null-val + (combiner (term a) (accumulate-r combiner null-val term (next a) next b)) + ) + ) +(define (sum-combiner t acc) + (+ t acc) + ) +(define (sum-a term a next b) + (accumulate-r (lambda (t acc) (+ t acc)) 0 term a next b) + ) + +(define (prod-a term a next b) + (accumulate-r (lambda (t acc) (* t acc)) 1 term a next b) + ) + +(define (accumulate-i combiner null-val term a next b) + ;; Iterative accumulator. + (define (iter-a a result) + (if (> a b) + result + (iter-a (next a) (combiner (term a) result)) + ) + ) + (iter-a a null-val) + ) +(define (identity x) x) +(define (add1 x) (+ x 1)) +(define (sum-ai term a next b) + (accumulate-i sum-combiner 0 term a next b) + ) +(define (prod-ai term a next b) + (accumulate-i (lambda (t acc) (* t acc)) 1 term a next b)) +(define (fakulteta-ai n) (prod-ai identity 2 add1 n)) + +;; excercise 1.33 filtered accumulate - combine only those term derived from +;; values in the range that satisfy a specified condition (predicate). +;; a) sum of squares of prime numbers - assuming prime? exists already + +(define (filtered-accumulate-r combiner null-val predicate term a next b) + ;; combiner 2 args - element and accumulation + ;; predicate 1 arg - a condition when to apply combiner + ;; term 1 arg - a function to compute the term + ;; next 1 arg - compute a next step + (if (> a b) + null-val + (if (predicate a) + (combiner (term a) (filtered-accumulate-r combiner null-val predicate term (next a) next b)) + ;; should I call combiner with null-val instead of (term a) or can I + ;; directly call filtered-accumulate-r? + (filtered-accumulate-r combiner null-val predicate term (next a) next b) + ) + ) + ) +;; (filtered-accumulate-r sum-combiner 0 even? identity 1 add1 11) +(define (filtered-accumulate-i combiner null-val predicate term a next b) + (define (iter-fa a result) + (if (> a b) + result + (iter-fa (next a) + (if (predicate a) + (combiner (term a) result) + (combiner null-val result) + ) + ) + ) + ) + (iter-fa a null-val) + )
-
-

2.15. 1.3.2 Sestavljanje procedur z Lambda

-
+
+

1.15. 1.3.2 Sestavljanje procedur z Lambda

+

Splosna forma let izraza

-
+
 (let ((<var1> <exp1>)
       (<var2> <exp2>)
       ...
@@ -818,7 +944,7 @@ Splosna forma let izraza
 

To je okrajsava za

-
+
 ((lambda (<var1> ... <varn>)
     <body>)
   <exp1>
@@ -830,9 +956,9 @@ To je okrajsava za
 
-
-

2.16. 1.3.3 Procedure kot splosne metode

-
+
+

1.16. 1.3.3 Procedure kot splosne metode

+

Ce pogledamo proceduro za integral, vidimo mocnejse abstrakcije: procedure, ki izrazajo splosne racunske metode, neodvisne od posameznih vkljucenih funkcij. @@ -840,9 +966,9 @@ izrazajo splosne racunske metode, neodvisne od posameznih vkljucenih funkcij.

-
-

2.17. 1.3.4 Procedure kot vrnjene vrednosti

-
+
+

1.17. 1.3.4 Procedure kot vrnjene vrednosti

+

V splošnem programski jeziki omejujo, kateri komputacijski elemente lahko (koda) spreminja. Elementi z najmanj omejitvami imajo prvorazredni status. Pravice in @@ -866,11 +992,302 @@ spremenljivke shranjene v procedurino okolje (poglavje 4.1).

+ + +
+

2. Grajenje absrakcij s podatki

+
+

+Poglavje bo govorilo o kompleksnih podatkih. Poglavje 1 govori o grajenju +abstrakcij z zdruzevanjem procedur, ki tvorijo sestavljene procedure (compound). +V poglavju 2 pa bo fokus na grajenju abstrakcij z zdruzevanjem podatkovnih +objektov v sestavljene podatke (compound). +

+ +

+Z zdruzenimi podatkovnimi objekti lahko procedure delajo nad njimi ne da bi bile +odvisne od njihove natancne strukture. +

+ +

+Podobno kot pri sestavljenih procedurah gre tudi pri sestavljenih podatkovnih +objektih za nacin spoprijemanja s kompleksnostjo - podatkovne abstrakcije +omogocijo postavitev primernih abstrakcijskih pregrad med razlicnimi deli +programa. +

+ +

+Napoved, kaj se bo pregledalo v 2. poglavju (bi bilo smiselno povzet). +

+
+ +
+

2.1. Uvod v podatkovne abstrakcije

+
+

+Podatkovna abstrakcija je metodologija, ki nam omogoci, da locimo kako so +sestavljeni podatki uporabljeni od detajlov o tem, kako so izgrejeni iz +primitivnih podatkovnih objektov. (To je analogno grajenju produceur, ki imajo +vgrajene druge procedue iz poglavja 1.1.8) +

+ +

+Skratka programe hocemo graditi tako, da uporabljajo podatke na nacin, da nimajo +nobenih predpostavk o tem, kaksni naj so ti podatki (oziroma cim manj), ravno +dovolj za izvajanje potrebnih operacij. Hkrati so konkretne reprezentacije +podatkov definirane neodvisno od programov, ki podatke uporabljajo. +

+ +

+Selektorji in konstruktorji. +

+
+ +
+

2.1.1. Aritmeticne operacije z racionalnimi stevili

+
+
+
(define (add-rat x y)
+  (make-rat (+ (* (numer x) (denom y))
+               (* (numer y) (denom x))
+               )
+            (* (denom x) (denom y))
+            )
+  )
+
+(define (sub-rat x y)
+  (make-rat (- (numer x) (denom y)
+               (numer y) (denom x)
+               )
+            (* (denom x) (denom y))
+            )
+  )
+
+(define (mul-rat x y)
+  (make-rat (* (numer x) (numer y))
+            (* (denom x) (denom y))
+            )
+  )
+
+(define (div-rat x y)
+  (make-rat (* (numer x) (denom y))
+            (* (denom x) (numer y)))
+  )
+
+(define (equal-rat? x y)
+  (= (* (numer x) (denom y))
+     (* (numer y) (denom x))
+     )
+  )
+
+(define (make-rat n d) (cons n d))
+
+(define (numer x) (car x))
+(define (denom x) (cdr x))
+
+(define (print-rat x)
+  (display (numer x))
+  (display "/")
+  (display (denom x))
+  (newline)
+  )
+(define one-half (make-rat 1 2))
+(define one-third (make-rat 1 3))
+
+;; excercise 2.1
+
+(define (make-rat-norm n d)
+  (if (< d 0)
+      (make-rat (* n -1) (* d -1))
+      (make-rat n d)
+      )
+  )
+
+
+ +

+Sestavljena strkutura par, ki je konstruirana s primitivno proceduro cons. S +primitivnimi procedurami car in cdr lahko dobimo prvi in ostale elemente +para. +

+
+ +
    +
  • Predstavljanje racionalnih stevil
    +
    +

    +Glej zgornji codeblock. +

    +
    +
  • +
+
+ +
+

2.1.2. Pregrade abstrakcij

+
+

+Splosna ideja podatkovnih abstrakcij je, da se identificira za vsak tip podatka +osnovni set opraracij, s katerimi bodo vse procedure, ki bodo manipulirale +podatke operirale, oziroma bodo iz njih sestavljene. Nato se uporabljamo samo te +operacije pri delu s podatki. +

+ +

+Pregrade: +

+
    +
  • programi, ki uporabljajo racionalna stevila
  • +
  • racionalna stevila v problemskem polju +
      +
    • add-rat, sub-rat
    • +
  • +
  • racionalna stevila kot stevci in imenovalci +
      +
    • make-rat, number, denom
    • +
  • +
  • racionalna stevila kot pari +
      +
    • cons, car, cdr
    • +
  • +
  • kakor so pac pari implementirani
  • +
+ +

+Procedure na vsakem nivoju so vmesniki, ki definirajo abstrakcijski nivo in med +sabo povezujejo razlicne nivoje. +

+ +

+Ena od prednosti razdelitve na nivoje je, da je programe lazje vzdrzevati in +spreminjati, ker lahko delas spremembe na posameznem nivoju, ki ne vplivajo +izven svojega nivoja. +

+ +

+vaja 2.2 +

+
+
;; crte v prostoru
+(define (make-segment startp endp)
+  (cons startp endp)
+  )
+(define (make-line x1 y1 x2 y2)
+  (make-segment (make-point x1 y1) (make-point x2 y2))
+  )
+
+(define (start-segment segment)
+  (car segment)
+  )
+(define (end-segment segment)
+  (cdr segment)
+  )
+
+
+(define (make-point x y)
+  (cons x y)
+  )
+(define (x-point p) (car p))
+(define (y-point p) (cdr p))
+
+(define (mid-point segment)
+  (make-point
+   (/ (+ (x-point (start-segment segment)) (x-point (end-segment segment))) 2)
+   (/ (+ (y-point (start-segment segment)) (y-point (end-segment segment))) 2)
+   )
+  )
+
+(define (print-point p)
+  (display "(")
+  (display (x-point p))
+  (display ",")
+  (display (y-point p))
+  (display ")")
+  (newline)
+  )
+
+;; vaja 2.3 :: segment je lahko tudi pravokotnik, ce nimamo rotacije in je crta
+;; vedno diagonala. Delal bom brez rotacije, zato ker potem ni dovolj imeti
+;; konstruktorja, ki je samo kons, ampak rabim 3 parametre, segment in rotacija
+;; in potem nvm kako delat selektorje in pa se vse se mi zakomplicira in se mi
+;; ne da, ker je nedelja zvecer.
+
+;; brez rotacije - 2a + 2b
+(define (perimeter rectangle)
+  (+ (* 2 (side-a rectangle)) (* 2 (side-b rectangle)))
+  )
+(define (area rectangle)
+  (* (side-a rectangle) (side-b rectangle))
+  )
+;; selektor (brez rotacije)
+(define (side-a rectangle)
+  (abs (- (x-point (start-segment rectangle)) (x-point (end-segment rectangle))))
+  )
+(define (side-b rectangle)
+  (abs (- (y-point (start-segment rectangle)) (y-point (end-segment rectangle))))
+  )
+;; sedaj vpeljemo drugo reprezentacijo pravokotnikov (nic vec s segmentom)
+;; ali lahko obseg in ploscina se vedno delujeta?
+
+;; odvisna sta od side-a in side-b. Ce to zemanjam, bosta obseg in ploscina se
+;; vedno delovali.
+
+
+
+
+ +
+

2.1.3. Kaj so podatki?

+
+

+Pri racionalnih stevilih imamo se en pogoj: +

+ +

+(/ (numer x) (denom x)) = n/d +

+ +

+Selektorji konstruktorji in pogoji tvorijo veljavno reprezentacijo. +

+ +

+Vsaka trojica procedur, ki ustreza pogoju, da ce zdruzis dva objekta, in potem z +eno proceduro dobis iz zdruzenih prvi objekt in z drugo drugi objekt, je potem +trojica procedu za delanje s pari. +

+ +

+Trojico procedur (cons, car, cdr) se da implementirati brez podatkov: +

+ +
+
(define (cons-p x y)
+  (define (dispatch m)
+    (cond
+     ((= m 0) x)
+     ((= m 1) y)
+     (else (error "Argument not 0 or 1 -- CONS" m))
+     )
+    )
+  dispatch)
+(define (car-p z) (z 0))
+(define (cdr-p z) (z 1))
+
+
+ +

+Zdaj imamo procedure za delanje s pari, ki so definirane brez podatkov. +Obskurno, ampak v okviru definije delanja s pari. Na tem primeru vidimo, da +zmoznost manipuliranja procedur kot objektov avtomaticno omogoci moznost za +reprezentacijo sestavljenih podatkov. (Proceduralna reprezentacija podatkov bo +igrala osrednjo vlogo v nadaljevanju - temu se rece message passing in bo +osnovno orodje v tretjem poglavju o problemih modeliranja in simulacije). +

+
+
+
-
-

Author: Lio Novelli

-

Created: 2024-05-29 Wed 21:50

-

Validate

\ No newline at end of file diff --git a/zapiski/sicp-lio.org b/zapiski/sicp-lio.org index 712f713..656714a 100644 --- a/zapiski/sicp-lio.org +++ b/zapiski/sicp-lio.org @@ -2,6 +2,10 @@ #+AUTHOR: Lio Novelli * Foreword and Preface +:PROPERTIES: +:UNNUMBERED: t +:END: + #+begin_quote Lisp je preživeli, v uporabi je že "polovico stoletja". @@ -31,7 +35,7 @@ natančno spoprijemanje s pojmovanjem "kaj je". Računanje pa ponudi okvir za na ukvarjanje s pojmovanjem "kako". #+end_quote -* 1. Grajenje abstrakcij s procedurami +* Grajenje abstrakcij s procedurami ** Elementi programiranja @@ -202,6 +206,8 @@ Normalni vrstni red: izvrsi test in pride v if, ki ne izvrsi drugega dela. ** 1.2.4 Eksponentna funkcija +Tukaj se naucimu successive squaring, ki potem se veckrat prav pride. + #name: exponent #+begin_src scheme ;; O(n) korakov in O(n) prostora @@ -283,6 +289,43 @@ Normalni vrstni red: izvrsi test in pride v if, ki ne izvrsi drugega dela. (else (fast-multi-iter a (- b 1) (+ s a))) ) ) + + ;; excercise 1.19 - fast fibnonachi + (define (fast-fibo n) + (fast-fibo-iter 1 0 0 1 n) + ) + (define (fast-fibo-iter a b p q count) + (cond ((= count 0) b) + ((even? count) + (fast-fibo-iter + a + b + (+ (* p p) (* q q)) + (+ (* q q) (* 2 p q)) + (/ count 2) + ) + ) + (else (fast-fibo-iter + (+ (* b q) (* a q) (* a p)) + (+ (* b p) (* a q)) + p + q + (- count 1) + )) + ) + ) + ;; p' = q^2 + 2pq + ;; p' = p^2 + q^2 + (define (slow-fibo n) + (cond ((= n 0) 0) + ((= n 1) 1) + (else (+ + (slow-fibo (- n 1)) + (slow-fibo (- n 2)) + )) + ) + ) + ;; melje melje in melje . fast-fibo iypljune takoj #+end_src ** 1.2.5 Najvecji skupni deljitel @@ -544,3 +587,232 @@ moč programskega jezika. Najvišja cena pri implementaciji procedur s prvorazrednim statusom je, da je potrebno rezervirati prostor za procedurine proste spremenljivke tudi, ko se procedura ne izvaja. V scheme-u so te spremenljivke shranjene v procedurino okolje (poglavje 4.1). + + +* Grajenje absrakcij s podatki + +Poglavje bo govorilo o kompleksnih podatkih. Poglavje 1 govori o grajenju +abstrakcij z zdruzevanjem procedur, ki tvorijo sestavljene procedure (compound). +V poglavju 2 pa bo fokus na grajenju abstrakcij z zdruzevanjem podatkovnih +objektov v sestavljene podatke (compound). + +Z zdruzenimi podatkovnimi objekti lahko procedure delajo nad njimi ne da bi bile +odvisne od njihove natancne strukture. + +Podobno kot pri sestavljenih procedurah gre tudi pri sestavljenih podatkovnih +objektih za nacin spoprijemanja s kompleksnostjo - podatkovne abstrakcije +omogocijo postavitev primernih abstrakcijskih pregrad med razlicnimi deli +programa. + +Napoved, kaj se bo pregledalo v 2. poglavju (bi bilo smiselno povzet). + +** Uvod v podatkovne abstrakcije + +Podatkovna abstrakcija je metodologija, ki nam omogoci, da locimo kako so +sestavljeni podatki uporabljeni od detajlov o tem, kako so izgrejeni iz +primitivnih podatkovnih objektov. (To je analogno grajenju produceur, ki imajo +vgrajene druge procedue iz poglavja 1.1.8) + +Skratka programe hocemo graditi tako, da uporabljajo podatke na nacin, da nimajo +nobenih predpostavk o tem, kaksni naj so ti podatki (oziroma cim manj), ravno +dovolj za izvajanje potrebnih operacij. Hkrati so konkretne reprezentacije +podatkov definirane neodvisno od programov, ki podatke uporabljajo. + +Selektorji in konstruktorji. + +*** Aritmeticne operacije z racionalnimi stevili + +#+begin_src scheme + (define (add-rat x y) + (make-rat (+ (* (numer x) (denom y)) + (* (numer y) (denom x)) + ) + (* (denom x) (denom y)) + ) + ) + + (define (sub-rat x y) + (make-rat (- (numer x) (denom y) + (numer y) (denom x) + ) + (* (denom x) (denom y)) + ) + ) + + (define (mul-rat x y) + (make-rat (* (numer x) (numer y)) + (* (denom x) (denom y)) + ) + ) + + (define (div-rat x y) + (make-rat (* (numer x) (denom y)) + (* (denom x) (numer y))) + ) + + (define (equal-rat? x y) + (= (* (numer x) (denom y)) + (* (numer y) (denom x)) + ) + ) + + (define (make-rat n d) (cons n d)) + + (define (numer x) (car x)) + (define (denom x) (cdr x)) + + (define (print-rat x) + (display (numer x)) + (display "/") + (display (denom x)) + (newline) + ) + (define one-half (make-rat 1 2)) + (define one-third (make-rat 1 3)) + + ;; excercise 2.1 + + (define (make-rat-norm n d) + (if (< d 0) + (make-rat (* n -1) (* d -1)) + (make-rat n d) + ) + ) +#+end_src + +Sestavljena strkutura ~par~, ki je konstruirana s primitivno proceduro ~cons~. S +primitivnimi procedurami ~car~ in ~cdr~ lahko dobimo prvi in ostale elemente +para. + +**** Predstavljanje racionalnih stevil +:PROPERTIES: +:UNNUMBERED: t +:END: + +/Glej zgornji codeblock./ + +*** Pregrade abstrakcij + +Splosna ideja podatkovnih abstrakcij je, da se identificira za vsak tip podatka +osnovni set opraracij, s katerimi bodo vse procedure, ki bodo manipulirale +podatke operirale, oziroma bodo iz njih sestavljene. Nato se uporabljamo samo te +operacije pri delu s podatki. + +Pregrade: +- programi, ki uporabljajo racionalna stevila +- racionalna stevila v problemskem polju + - ~add-rat~, ~sub-rat~ ... +- racionalna stevila kot stevci in imenovalci + - ~make-rat~, ~number~, ~denom~ +- racionalna stevila kot pari + - ~cons~, ~car~, ~cdr~ +- kakor so pac pari implementirani + +Procedure na vsakem nivoju so vmesniki, ki definirajo abstrakcijski nivo in med +sabo povezujejo razlicne nivoje. + +Ena od prednosti razdelitve na nivoje je, da je programe lazje vzdrzevati in +spreminjati, ker lahko delas spremembe na posameznem nivoju, ki ne vplivajo +izven svojega nivoja. + +/vaja 2.2/ +#+begin_src scheme + ;; crte v prostoru + (define (make-segment startp endp) + (cons startp endp) + ) + (define (make-line x1 y1 x2 y2) + (make-segment (make-point x1 y1) (make-point x2 y2)) + ) + + (define (start-segment segment) + (car segment) + ) + (define (end-segment segment) + (cdr segment) + ) + + + (define (make-point x y) + (cons x y) + ) + (define (x-point p) (car p)) + (define (y-point p) (cdr p)) + + (define (mid-point segment) + (make-point + (/ (+ (x-point (start-segment segment)) (x-point (end-segment segment))) 2) + (/ (+ (y-point (start-segment segment)) (y-point (end-segment segment))) 2) + ) + ) + + (define (print-point p) + (display "(") + (display (x-point p)) + (display ",") + (display (y-point p)) + (display ")") + (newline) + ) + + ;; vaja 2.3 :: segment je lahko tudi pravokotnik, ce nimamo rotacije in je crta + ;; vedno diagonala. Delal bom brez rotacije, zato ker potem ni dovolj imeti + ;; konstruktorja, ki je samo kons, ampak rabim 3 parametre, segment in rotacija + ;; in potem nvm kako delat selektorje in pa se vse se mi zakomplicira in se mi + ;; ne da, ker je nedelja zvecer. + + ;; brez rotacije - 2a + 2b + (define (perimeter rectangle) + (+ (* 2 (side-a rectangle)) (* 2 (side-b rectangle))) + ) + (define (area rectangle) + (* (side-a rectangle) (side-b rectangle)) + ) + ;; selektor (brez rotacije) + (define (side-a rectangle) + (abs (- (x-point (start-segment rectangle)) (x-point (end-segment rectangle)))) + ) + (define (side-b rectangle) + (abs (- (y-point (start-segment rectangle)) (y-point (end-segment rectangle)))) + ) + ;; sedaj vpeljemo drugo reprezentacijo pravokotnikov (nic vec s segmentom) + ;; ali lahko obseg in ploscina se vedno delujeta? + + ;; odvisna sta od side-a in side-b. Ce to zemanjam, bosta obseg in ploscina se + ;; vedno delovali. +#+end_src + +*** Kaj so podatki? + +Pri racionalnih stevilih imamo se en pogoj: + +~(/ (numer x) (denom x)) = n/d~ + +Selektorji konstruktorji in pogoji tvorijo veljavno reprezentacijo. + +Vsaka trojica procedur, ki ustreza pogoju, da ce zdruzis dva objekta, in potem z +eno proceduro dobis iz zdruzenih prvi objekt in z drugo drugi objekt, je potem +trojica procedu za delanje s pari. + +Trojico procedur (cons, car, cdr) se da implementirati brez podatkov: + +#+begin_src scheme + (define (cons-p x y) + (define (dispatch m) + (cond + ((= m 0) x) + ((= m 1) y) + (else (error "Argument not 0 or 1 -- CONS" m)) + ) + ) + dispatch) + (define (car-p z) (z 0)) + (define (cdr-p z) (z 1)) +#+end_src + +Zdaj imamo procedure za delanje s pari, ki so definirane brez podatkov. +Obskurno, ampak v okviru definije delanja s pari. Na tem primeru vidimo, da +zmoznost manipuliranja procedur kot objektov avtomaticno omogoci moznost za +reprezentacijo sestavljenih podatkov. (Proceduralna reprezentacija podatkov bo +igrala osrednjo vlogo v nadaljevanju - temu se rece /message passing/ in bo +osnovno orodje v tretjem poglavju o problemih modeliranja in simulacije).