125
Lekciju materiāls sagatavots projekta “RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana” ietvaros ©RTU, 2006 Funkcionālā Funkcionālā programmēšana (DIP330) programmēšana (DIP330)

Funkcionālā programmēšana (DIP330)

  • Upload
    avon

  • View
    41

  • Download
    3

Embed Size (px)

DESCRIPTION

Funkcionālā programmēšana (DIP330). Funkcionālā programmēšana. Asociētais profesors, Dr.sc.ing. Vjačeslavs Šitikovs Rīgas Tehniskā universitāte Datorzinātnes un informācijas tehnoloģijas fakultāte Lietišķo datorsistēmu institūts Lietišķo datorsistēmu programmatūras profesora grupa. - PowerPoint PPT Presentation

Citation preview

Page 1: Funkcionālā programmēšana (DIP330)

Lekciju materiāls sagatavots projekta“RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana” ietvaros

©RTU, 2006

Funkcionālā Funkcionālā programmēšana (DIP330)programmēšana (DIP330)

Page 2: Funkcionālā programmēšana (DIP330)

2RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcionālā programmēšanaFunkcionālā programmēšana

Asociētais profesors, Dr.sc.ing. Vjačeslavs Šitikovs

Rīgas Tehniskā universitāteDatorzinātnes un informācijas tehnoloģijas fakultāteLietišķo datorsistēmu institūtsLietišķo datorsistēmu programmatūras profesora grupa

Page 3: Funkcionālā programmēšana (DIP330)

3RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Priekšmeta pamatdatiPriekšmeta pamatdati

• Priekšmeta pieteicējs: Vjačeslavs Šitikovs• Apjoms: 2 KP• Kontroles veids: Eksāmens; Studiju darbs• Studiju līmenis: Akadēmiskā bakalaura

studiju programma• Semestris: 5. semestris

Page 4: Funkcionālā programmēšana (DIP330)

4RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Priekšmeta mērķi un uzdevumiPriekšmeta mērķi un uzdevumi

• Mērķi:– Funkcionāla pieeja algoritmu izstrādei. Rekursīva pieeja funkciju

aprakstam. Problēmu risināšana sakot no gaidāma rezultāta. Programmatūras rīku izvēle specifiskas problēmas risināšanai.

• Uzdevumi:– Apgūt konkrēto funkcionālas programmēšanas valodas LISP

pamatus sagatavot pirmo nesarežģīto programmu (sarakstu apstrāde).

– Apgūt valodas LISP realizācijas LispWorks pamatus praktiski, izpildot pirmo programmu. Mērījums – strādājoša programma un atskaite.

– Apgūt daudzlīmeņu sarakstu rekursīvo apstrādi. Mērījums – strādājoša programma un atskaite.

– Apgūt sarežģīto problēmu risināšanu, kurai vispiemērotākā ir funkcionāla rekursīva pieeja. Mērījums – atskaite par studijas darbu, tas aizstāvēšana un atzīme.

Page 5: Funkcionālā programmēšana (DIP330)

5RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PamatliteratūraPamatliteratūra

• Šitikovs V. “Programmēšanas valoda LISP. Lekciju konspekts“ // RTU, 2002, 36 lpp.– Valodas LISP īss apraksts ar piemēriem un

paskaidrojumiem.

• Šitikovs V. “Programmēšanas valoda LISP. Lekciju konspekts“ // RTU, 2002 / Internet - http://www.cs.rtu.lv/PubsLoc/Sitikovs /saturs.htm– Valodas LISP īsa apraksta Internet-versija ar

piemēriem un paskaidrojumiem.

Page 6: Funkcionālā programmēšana (DIP330)

6RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PapildliteratūraPapildliteratūra

• Маурер У. Введение в программирование на языке ЛИСП. – М.: Мир, 1976. – 104.– Valodas LISP īss apraksts ar piemēriem un paskaidrojumiem

krievu valodā.

• Graham P. “On Lisp. Advanced Techniques for Common Lisp”// Prentice Hall, 1993, 432 pages (free download from http://www.paulgraham.com/onlisptext.html).– Valodas LISP detalizēts apraksts.

• Schwarz M. „LISP Tutorial“ / Internet. - http://cs1.cs.nyu.edu/phd_students/schwarz/NLCP/lisp.html– Valodas LISP detalizēta apraksta interaktīva versija.

Page 7: Funkcionālā programmēšana (DIP330)

7RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Atslēgas vārdiAtslēgas vārdi

• Nealgoritmiska programmēšanas valoda

• Funkciju valoda• Sarakstu apstrādāšana• Rekursija• Rekursīvas funkcijas• Funkciju noteikšana• Nealgoritmiskās un algoritmiskās

pieejas kombinācija

Page 8: Funkcionālā programmēšana (DIP330)

8RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Pamattēmas (1)Pamattēmas (1)

• Ievads. Valodas apraksts – alfabēts, pamatkonstrukcijas (atomi, saraksti, izteiksmes, apakšsaraksti).

• Rekursija. Tieša un netieša rekursija. Cikliskas un rekursīvas pieejas salīdzinājums.

• Funkciju izveidošana – sintakse, semantika, pieejas, paņēmieni, parametri.

• Funkcijas sarakstu apstrādei. Ievade-izvade. Interaktīvas funkcijas

• Predikāti un to pielietošana sarakstu apstrādei.• Nosacījuma izteiksmes, nosacījuma funkcijas.• Rekursīvas funkcijas – sarakstu rekursīvā apstrāde,

apakšsaraksti un rekursija, rekursīvie predikāti.

Page 9: Funkcionālā programmēšana (DIP330)

9RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Pamattēmas (2)Pamattēmas (2)

• Loģiskie operatori un to pielietošana sarakstu apstrādei.• Rekursīvās funkcijas no diviem sarakstiem.• Funkcijas tipu izzināšanai. Argumentu validācija.• PROG-izteiksmes – apraksti, operatori, iezīmes, vadības

nodošana, nosacījuma izteiksmes, vērtības atgriešana. PROG- izteiksmes sarakstu apstrādei, sarakstu veidošana.

• Funkcijas darbība.• Predikāti, kuri uzrakstīti ar PROG palīdzību.• Rekursija PROG-izteiksmēs.• Funkciju apvienošana.• Izskaitļošanas noteikums, izskaitļojoša funkcija.• Programma kā dati.

Page 10: Funkcionālā programmēšana (DIP330)

10RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (1)Ievads (1)

• Visu programmēšanas valodu kopu var sadalīt:– algoritmiskās jeb imperatīvās (instrukciju

valodās) – nealgoritmiskās

• Algoritmiskās– norādīta nepieciešamā darbību secība

– universālas programmēšanas valodas• Pascal, C, Basic u.t.t.

Page 11: Funkcionālā programmēšana (DIP330)

11RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (2)Ievads (2)

• Speciālu uzdevumu risināšanā– GPSS - vispārējas apkalpošanas

sistēmu modelēšanai– PROLOG - teorēmu pierādījuma tipa

uzdevumiem– LISP - dialoga realizēšanai valodā,

kura ir tuva dabīgai valodai

Page 12: Funkcionālā programmēšana (DIP330)

12RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (3)Ievads (3)

• LISP– saīsinājums no LISt Processing -

sarakstu apstrādāšana– nealgoritmiska programmēšanas

valoda– funkcionāla programmēšanas valoda

Page 13: Funkcionālā programmēšana (DIP330)

13RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (4)Ievads (4)

Imperatīva valoda

Input (a,b)c := a + bPrint (c)

Sākums -> Vidus-> Nobeigums

Funkcionāla valoda

Print (Plus Input() Input() )

Nobeigums ( Vidus (Sākums) )

Page 14: Funkcionālā programmēšana (DIP330)

14RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (5)Ievads (5)

• LISP– Džona Maikarta vadībā– Masačūsetas tehnoloģiskajā institūtā– 1960.gadā– lai aprakstītu simbolisko izteiksmju

rekursīvās funkcijas

Page 15: Funkcionālā programmēšana (DIP330)

15RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (6)Ievads (6)

• LISP– funkciju valoda– katra konstrukcija, kura ir uzrakstīta

valodā LISP, tiek apskatīta kā funkcija•(A B C) ir A(B,C)•sin x

– algoritmiskā valodās izskatās kā sin(x)– valodā LISP kā (sin x)

Page 16: Funkcionālā programmēšana (DIP330)

16RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievads (7)Ievads (7)

• Valodā LISP izņēmumu nav– x + y

•tiek pierakstīts kā (+ x y)

• Par funkcijas argumentu var būt citas funkcijas rezultāts– (A+B)*(C+D)

• tiek pierakstīts kā (*(+ A B)(+ C D))

Page 17: Funkcionālā programmēšana (DIP330)

17RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (1)Valodas apraksts (1)

• Alfabēts– burti– cipari– ierobežotāji

•( - kreisā apaļā iekava•) - labā apaļā iekava•_ - intervāls

• Litera - drukāta zīme no alfabēta

Page 18: Funkcionālā programmēšana (DIP330)

18RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (2)Valodas apraksts (2)

• Atoms – patvaļīga literu secība, kura atrodas

starp diviem ierobežotājiem un pie kuras nepieder paši ierobežotāji

– konstrukcijā (A(ATOM X24)-ABC(-10 2.5)) atomi ir• A ATOM X24 -ABC -10 2.5

Page 19: Funkcionālā programmēšana (DIP330)

19RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (3)Valodas apraksts (3)

• Atomi– konstantes– identifikatori

•mainīgie•funkciju vārdi•jāsākas ar burtu un tam jāsastāv tikai no

burtiem un cipariem•nav ierobežojumu mainīgā vārda

garumam

Page 20: Funkcionālā programmēšana (DIP330)

20RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (4)Valodas apraksts (4)

• Rezervēti identifikatori– T - patiess (true),– F - nepatiess (false),– NIL - tukšums, kurš bieži tiek lietots

“nepatiess” vietā

Page 21: Funkcionālā programmēšana (DIP330)

21RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (5)Valodas apraksts (5)

• Mainīgajam var būt vērtība• Viens no vērtību piešķiršanas veidiem

– izmantojot funkciju SETQ •(SETQ X 5) analoģiski X:=5•(SETQ X (+ Y 1)) analoģiski x:=y+1•(SETQ X Y) analoģiski x:=y•(SETQ X (QUOTE Y)) analoģiski x:=“y”

– (SETQ X ‘Y)

Page 22: Funkcionālā programmēšana (DIP330)

22RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (6)Valodas apraksts (6)

• SETQ– netieši tiek izmantota funkcija QUOTE– piešķires funkcija SET

•(SET X Y) nozīme ka vērtībai X tiek piešķita Y vērtība

– Ja X ir vienāds ar 3 un Y ir vienāds ar 6, tad funkcija SET piešķirt skaitlim 3 skaitļa 6 vērtību, kas ir bezjēdzība

– (SET(QUOTE X) Y) vai (SETQ X Y)•piešķir mainīgajam X vērtību 6

Page 23: Funkcionālā programmēšana (DIP330)

23RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (7)Valodas apraksts (7)

• Ja X vērtība ir simbols Z– (SET X Y) ievieto mainīgajā Z

mainīgā Y vērtību•analoģiski z:=y

Page 24: Funkcionālā programmēšana (DIP330)

24RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (8)Valodas apraksts (8)

• Saraksti– elementu secība, kura ietverta apaļās iekavās– saraksta elements - atoms vai saraksts– saraksta elementu atdalītāji – intervāli

• Atdalītājs ir nepieciešams, ja abi saraksta blakus elementi ir atomi.

– Sarakstu piemēri• (A B C D) • (x) ((((100)))) (1(2 3)4)• () - tukšs saraksts

Page 25: Funkcionālā programmēšana (DIP330)

25RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (9)Valodas apraksts (9)

• Izteiksme ir atoms vai saraksts– Dažām izteiksmēm var būt vērtības

•Izteiksmes vērtība arī var būt izteiksme– Izteiksmes, kurām var būt vērtība

•konstantes, mainīgie•saraksti

– griešanās pie funkcijām» (P Q R) ir funkcijas P vērtība no

argumentiem Q un R» (G) - funkcija bez argumentiem

Page 26: Funkcionālā programmēšana (DIP330)

26RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (10)Valodas apraksts (10)

• Ir tikai viens konstrukcijas veids, kas tiek izskatīts valodā LISP – tās ir funkcijas

• Pārējie valodas LISP līdzekļi, tādi kā:– jaunu funkciju noteikšana– nosacījuma un beznosacījuma vadības

nodošana u.t.t.– tiek noteikti ar speciālu funkciju

palīdzību

Page 27: Funkcionālā programmēšana (DIP330)

27RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (11)Valodas apraksts (11)

• Funkcija QUOTE– Funkcija QUOTE ir vienīgā, kura

neatbilst noteikumam, ka pirmais saraksta elements ir funkcijas vārds, bet pārējie saraksta elementi ir tās funkcijas argumenti

– (QUOTE(saraksts)) vērtība ir pats saraksts

Page 28: Funkcionālā programmēšana (DIP330)

28RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (12)Valodas apraksts (12)

• (SETQ X (1 2 3)) ir bezjēdzīga– nozīmē: "mainīgajam x piešķirt funkcijas 1

vērtību ar argumentiem 2 un 3

• (SETQ X (QUOTE (1 2 3)))– mainīgajam X ir piešķirta saraksta vērtība– saīsināti (SETQ X ‘(1 2 3))

• funkcijas LIST vērtība ir tās argumentu saraksts– (LIST 1 2 3) vērtība ir (1 2 3)

Page 29: Funkcionālā programmēšana (DIP330)

29RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (13)Valodas apraksts (13)

• Ja mainīgajam x ir piešķirta vērtība 2– (LIST 1 x 3 x) vērtība ir (1 2 3 2)– (QUOTE(1 x 3 x)) vērtība ir (1 x 3 x)

• Par daudzu funkciju vērtību var būt saraksts– (DIVIDE 65 3) vērtība ir (21 2), kur

•21 - veselā daļa un 2 - dalījuma atlikums

Page 30: Funkcionālā programmēšana (DIP330)

30RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (14)Valodas apraksts (14)

• Ja par funkcijas argumentu jābūt atomam un šī argumenta vietā ir saraksts kaut arī no viena elementa, tas noved pie kļūdas. Piemēram,– (SETQ X (LIST 3))– (SETQ Y (PLUS X 1)) – kļūda, jo

mainīgajam X būs vērtība (3)

Page 31: Funkcionālā programmēšana (DIP330)

31RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Valodas apraksts (15)Valodas apraksts (15)

• Apakšsaraksts - saraksts, kurš ietverts citā sarakstā

• ((1 6)7((8 4)3))– (1 6)– 7– ((8 4)3)

•(8 4) •3

Page 32: Funkcionālā programmēšana (DIP330)

32RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

RekursijaRekursija

• Griežas pašas pie sevis– tieši vai arī netieši– griežas pati pie sevis – tieši– A griežas pie B un B pie A – netieši

•Vispārīgā gadījumā ķēdīte var būt garāka

– n! = n * (n-1)!•Pilnīgs noteikums 0! = 1

– izteiksme ir atoms vai (izteiksmju secība)

Page 33: Funkcionālā programmēšana (DIP330)

33RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju izveidošana (1)Funkciju izveidošana (1)

• Parasti funkciju aprakstā ir četras pamatdaļas:– apraksta sākuma pazīme (vārds

FUNCTION, PROCEDURE u.t.t.)– funkcijas vārds– parametru saraksts pēc kārtas– nākošie teikumi, kuri patiesība

nosaka (definē) funkciju

Page 34: Funkcionālā programmēšana (DIP330)

34RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju izveidošana (2)Funkciju izveidošana (2)

• Valodā LISP– DEFUN - funkcija, lai aprakstītu funkciju

•3 argumenti– (DEFUN A (B C) D)

•D ir funkcijas A ar argumentiem B un C apraksts

– (DEFUN A (X Y) (+ X Y))– (DEFUN P (X) (* X X))

•(P 7) rezultāts ir 49

Page 35: Funkcionālā programmēšana (DIP330)

35RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju izveidošana (3)Funkciju izveidošana (3)

• Parametri– formālie

•tiek lietoti funkcijas aprakstam•tikai identifikatori

– faktiskie•lai grieztos pie funkcijas•var būt izteiksmes

Page 36: Funkcionālā programmēšana (DIP330)

36RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju izveidošana (4)Funkciju izveidošana (4)

• F(x,y) = x*x-y*y• (DEFUN F (X Y) (-(* X X) (* Y Y)))

– X un Y - formālie parametri– 4 un 3 – faktiskie parametri– (F 4 3) nozīmē, ka

• X saistās ar 4• Y saistās ar 3• F(4,3) =4*4-3*3=16-9=7

Page 37: Funkcionālā programmēšana (DIP330)

37RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju izveidošana (5)Funkciju izveidošana (5)

• (DEFUN F (X) (- (* X X) (* Y Y)))– funkcijas vērtība ir atkarīga no tā,

kāda vērtība funkcijas izskaitļošanas brīdī būs mainīgajam Y

– X ir saistošs (lokālais) mainīgais– Y ir brīvais (globālais) mainīgais

Page 38: Funkcionālā programmēšana (DIP330)

38RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (1)Funkcijas sarakstu apstrādei (1)

• Trīs primitīvākās – CAR, CDR un CONS

• CAR– arguments ir saraksts– vērtība ir pirmais saraksta elements– Ja x ir (2 6 4 7), tad (CAR x) ir 2– Ja x ir (2 (6 (4 (7)))), tad (CAR x) ir 2– Ja x ir ((2 6)(4 7)), tad (CAR x) ir (2 6)

Page 39: Funkcionālā programmēšana (DIP330)

39RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (2)Funkcijas sarakstu apstrādei (2)

• CAR– Ja x ir ((((2)6)4)7), tad (CAR x) ir (((2)6)4)– Ja x ir atoms, tad (CAR x) novedīs pie

kļūdas– (CAR (1 2 3)) ir bezjēdzīga

• griešanos pie funkcijas 1 no argumentiem 2 un 3

– (CAR (QUOTE (1 2 3))) vērtība ir 1

Page 40: Funkcionālā programmēšana (DIP330)

40RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (3)Funkcijas sarakstu apstrādei (3)

• CDR– arguments ir saraksts– vērtība ir saraksta atlikums bez pirma

elementa– Ja x ir (2 6 4 7), tad (CDR x) ir (6 4 7)– Ja x ir ((2 6)(4 7)), tad (CDR x) ir ((4 7))– Ja x ir ((((2) 6) 4) 7), tad (CDR x) ir (7)

Page 41: Funkcionālā programmēšana (DIP330)

41RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (4)Funkcijas sarakstu apstrādei (4)

• CDR– Ja x ir saraksts ar precīzi vienu elementu,

tad (CDR x) ir NIL, kurš šajā gadījumā apzīmē tukšu sarakstu

– Ja x ir atoms, tad (CDR x) novedīs pie kļūdas

Page 42: Funkcionālā programmēšana (DIP330)

42RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (5)Funkcijas sarakstu apstrādei (5)

•CONS– savāc (savieno) to, ko CAR un CDR ir

sadalījusi daļās– pirmais arguments vienalga kas– otrais arguments obligāti saraksts– Ja x ir 2 un y ir (6 4 7), tad (CONS

x y) ir (2 6 4 7)

Page 43: Funkcionālā programmēšana (DIP330)

43RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (6)Funkcijas sarakstu apstrādei (6)

• CONS– Ja x ir 2 un y ir ((6 (4(7)))), tad (CONS x

y) ir (2 (6 (4 (7))))– Ja x ir (2 6) un y ir ((4 7)), tad (CONS x

y) ir ((2 6)(4 7))– Ja x ir (((2) 6) 4) un y ir (7), tad (CONS x

y) ir ((((2) 6) 4) 7)– (CONS (CAR x) (CDR x)) ir x

Page 44: Funkcionālā programmēšana (DIP330)

44RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (7)Funkcijas sarakstu apstrādei (7)

•CAR un CDR kombinācijas– (CAR (CDR L)) – saraksta L otrais

elements•saīsināti (CADR L)

– (CAR (CDR (CDR L))) – saraksta L trešais elements•saīsināti (CADDR L)

– u.t.t.

Page 45: Funkcionālā programmēšana (DIP330)

45RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (8)Funkcijas sarakstu apstrādei (8)

• Atkarībā no realizācijas D D– C ... R A A

– (CDADDR Y) nozīmē (CDR (CAR (CDR (CDR Y))))

Page 46: Funkcionālā programmēšana (DIP330)

46RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas sarakstu apstrādei (9)Funkcijas sarakstu apstrādei (9)

•APPEND– savieno savā starpā divus sarakstus– Ja X ir (1 2 3) un Y ir (4 5 6), tad

(APPEND X Y) ir (1 2 3 4 5 6)– (CONS X Y) būtu ((1 2 3) 4 5 6)

Page 47: Funkcionālā programmēšana (DIP330)

47RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Predikāti (1)Predikāti (1)

• Funkcijas, kuru vērtība (rezultāts) var būt "patiesība" vai "meli“

• Valodā LISP predikātiem ir vērtība– T - patiess vai– NIL - nepatiess

Page 48: Funkcionālā programmēšana (DIP330)

48RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Predikāti (2)Predikāti (2)

• Funkcija ATOM– arguments ir atoms vai saraksts– ja atoms, tad funkcijas vērtība ir T,

pretējā gadījumā NIL– ja X ir 5, tad (ATOM X) ir T– ja X ir simbols, tad (ATOM X) ir T– ja X ir (1 2 3), tad (ATOM X) ir NIL

Page 49: Funkcionālā programmēšana (DIP330)

49RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Predikāti (3)Predikāti (3)

• Funkcija NULL– pārbauda vai tās argumenta vērtība nav

NIL– ja X ir 5, tad (NULL X) ir NIL– ja X ir (1 2 3), tad (NULL X) ir NIL– ja X ir NIL, tad (NULL X) ir T – ja X ir saraksts no viena elementa, tad

(NULL X) ir NIL, bet (NULL (CDR X)) ir T

Page 50: Funkcionālā programmēšana (DIP330)

50RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Predikāti (4)Predikāti (4)

• Funkcija EQUAL– pārbauda vai divu tās argumentu

vērtība ir vienāda– ja X ir (4 6 (8 3)) un Y ir ((4 6) 8 3),

tad (EQUAL X Y) ir NIL– ja X ir (+ 2 2) rezultāts un Y ir 4, tad

(EQUAL X Y) ir T

Page 51: Funkcionālā programmēšana (DIP330)

51RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Predikāti (5)Predikāti (5)

• Funkcija ZEROP– pārbauda vai tās arguments ir nulle– burts P nosaukumā nozīmē "predicate“– ja arguments ir nulle, tad funkcijas vērtība ir

T, pretējā gadījumā - NIL.

• Funkcija GREATERP vai >– divi argumenti

• Citas funkcijas >= < <= <> u.t.t.

Page 52: Funkcionālā programmēšana (DIP330)

52RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Nosacījuma izteiksmes (1)Nosacījuma izteiksmes (1)

• Nosacījuma operatora vietā, kā parasti, ir nosacījuma funkcija

• Funkcija COND– dažos gadījumos varam izlasīt sākot

ar "ja"– (COND ((ZEROP S)(SETQ Y 12)))

•ja S ir nulle, tad piešķirt mainīgajam Y vērtību 12

Page 53: Funkcionālā programmēšana (DIP330)

53RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Nosacījuma izteiksmes (2)Nosacījuma izteiksmes (2)

•COND– nenoteikts argumentu skaits– katrs no argumentiem ir pāris

•saraksts no diviem elementiem– pirmais pāra elements ir nosacījums– otrais pāra elements ir lielums vai

darbība– (COND ((> A 65) 10) ((> A 21) 30)

(T 0))

Page 54: Funkcionālā programmēšana (DIP330)

54RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Nosacījuma izteiksmes (3)Nosacījuma izteiksmes (3)

• COND– nenoteikts argumentu skaits– katrs no argumentiem ir pāris

• saraksts no diviem elementiem

– pirmais pāra elements ir nosacījums– otrais pāra elements ir lielums vai darbība– (COND ((> A 65) 10) ((> A 21) 30) (T

0))• if A>65 then 10 else if A>21 then 30 else 0

Page 55: Funkcionālā programmēšana (DIP330)

55RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Nosacījuma izteiksmes (4)Nosacījuma izteiksmes (4)

• Vispārējā gadījumā– LISP pēc kārtas apskata katru pāri no

pirmā līdz pēdējam– ja nosacījuma vērtība nav T, tiek ņemts

nākošais pāris– ja nosacījuma vērtība ir T, tad LISP

apstājas šajā vietā un par rezultātu ņem dotā pāra otro elementu

– pārbaude ne uz T, bet uz ne NIL

Page 56: Funkcionālā programmēšana (DIP330)

56RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Nosacījuma izteiksmes (5)Nosacījuma izteiksmes (5)

• Vispārējā gadījumā– LISP pēc kārtas apskata katru pāri – ja nosacījuma vērtība ir NIL, tiek ņemts nākošais

pāris– ja nosacījuma vērtība kaut kas cits, bet ne NIL,

tad LISP apstājas šajā vietā un par rezultātu ņem dotā pāra otro elementu

– (COND ((CDR L) 2) (T 1)) vērtība būs 2, ja L ir saraksts no vairāk kā viena elementa

– Pēdējais pāris ar T nodrošina, ka nosacījuma izteiksmei vienmēr ir vērtība (else sastāvdaļa)

Page 57: Funkcionālā programmēšana (DIP330)

57RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvas funkcijas (1)Rekursīvas funkcijas (1)

• faktoriāla rekursīvais nosacījums:– 0! = 1;– n! = n*(n-1)!

• Algoritmiskā valodā:integer procedure fact(n);integer n;fact:=if n =0 then 1 else n x fact (n-1);end

Page 58: Funkcionālā programmēšana (DIP330)

58RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvas funkcijas (2)Rekursīvas funkcijas (2)

• Valodā LISP(DEFUN FACT (N) (COND ((ZEROP N) 1) (T (* N (FACT (- N

1)))) ))

Page 59: Funkcionālā programmēšana (DIP330)

59RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Sarakstu rekursīvā apstrāde (1)Sarakstu rekursīvā apstrāde (1)

• Noteiksim funkciju ADD– saskaita visus saraksta elementus

• ja L ir (1 2 3 4 5), tad (ADD L) ir 15

(DEFUN ADD (L) (COND((NULL L) 0)(T (+ (CAR L)(ADD (CDR L))))) )

Page 60: Funkcionālā programmēšana (DIP330)

60RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Sarakstu rekursīvā apstrāde (2)Sarakstu rekursīvā apstrāde (2)

• Līdzīgā veidā var noteikt funkciju MULT– saraksta skaitļu reizinājums

• ja L ir (1 2 3 4 5), tad (MULT L) ir 120

(DEFUN MULT (L) (COND((NULL L) 1)(T (* (CAR L)(MULT (CDR L))))) )

Page 61: Funkcionālā programmēšana (DIP330)

61RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Apakšsaraksti un rekursija (1)Apakšsaraksti un rekursija (1)

• Funkcija ADD strādā nepareizi, ja saraksts L satur apakšsarakstus– funkcijas PLUS argumenti var būt

tikai atomi• Noteiksim funkciju ADD2

– saskaita visus saraksta un to apakšsarakstu elementus•ja L ir (1 (2 (3 4)) 5), tad (ADD2 L) ir 15

Page 62: Funkcionālā programmēšana (DIP330)

62RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Apakšsaraksti un rekursija (2)Apakšsaraksti un rekursija (2)

(DEFUN ADD2 (L) (COND((NULL L) 0)((ATOM (CAR L)) (+ (CAR L) (ADD2 (CDR L))))(T (+ (ADD2 (CAR L)) (ADD2 (CDR

L))))) )(ADD2 ‘(3 ((8 4) 7 (5 6))))

Page 63: Funkcionālā programmēšana (DIP330)

63RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

IzvadeIzvade

• Galarezultāts (visaugstākā līmeņa funkcijas rezultāts) ir izvests automātiski

• Starprezultāts– Funkcija PRINT– Neierobežots argumentu skaits– (PRINT 2 3 (+ 2 3))

2 3 5

Page 64: Funkcionālā programmēšana (DIP330)

64RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievade (1)Ievade (1)

• Funkcija INPUT– bez argumentiem– vērtība ir rinda līdz – (+ INPUT() INPUT() )>2>35>

Page 65: Funkcionālā programmēšana (DIP330)

65RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Ievade (2)Ievade (2)

• Funkcija INPUT>(CAR INPUT() )>(2 3)Error!>(CAR INPUT() )>’(2 3)2>

Page 66: Funkcionālā programmēšana (DIP330)

66RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvie predikāti (1)Rekursīvie predikāti (1)

• COND– pāru otrais elements

• T vai NIL

• Funkcija MEMBER – divi argumenti:

• atoms X• saraksts L

– ja X ir L sastāvdaļa, tad (MEMBER X L) ir T, pretējā gadījumā NIL

Page 67: Funkcionālā programmēšana (DIP330)

67RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvie predikāti (2)Rekursīvie predikāti (2)

(DEFUN MEMBER (X L) (COND((NULL L) NIL)((EQUAL X (CAR L) T)(T (MEMBER X (CDR L))) ))

(MEMBER ? ?)

Page 68: Funkcionālā programmēšana (DIP330)

68RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Loģiskie operatori (1)Loģiskie operatori (1)

• “Loģiskais UN" (konjunkcija)• “Loģiskais VAI" (disjunkcija)• Noliegums (inversija)• Funkcija NOT

– viens arguments– vērtība ir T, ja par argumentu kalpo NIL, un

NIL, ja par argumentu kalpo kaut kas atšķirīgs no NIL• Faktiski tā dara to pašu, ko funkcija NULL

Page 69: Funkcionālā programmēšana (DIP330)

69RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Loģiskie operatori (2)Loģiskie operatori (2)

• Funkcija AND– nenoteikts argumentu skaits– vērtība vienmēr būs NIL, ja kaut viens arguments

vienāds ar NIL– pretējā gadījumā vērtība būs T

• Funkcija OR– nenoteikts argumentu skaits– vērtība vienmēr būs T, ja kaut viens arguments

nav vienāds ar NIL– pretējā gadījumā vērtība būs NIL

Page 70: Funkcionālā programmēšana (DIP330)

70RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Loģiskie operatori (3)Loģiskie operatori (3)

• Noteiksim funkciju MEM2– saistīta ar MEMBER tieši tāpat, kā

ADD2 ar ADD– pārbaudīs

•vai pirmais arguments nav kāda saraksta loceklis

•vai kāda tā apakšsaraksta loceklis•vai kāda tā apakšsaraksta apakšsaraksta

loceklis•un tā tālāk

Page 71: Funkcionālā programmēšana (DIP330)

71RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Loģiskie operatori (4)Loģiskie operatori (4)

(DEFUN MEM2 (X L) (COND ((NULL L) NIL) (T (OR (COND ((ATOM (CAR L))

(EQUAL X (CAR L)))

(T (MEM2 X (CAR L))) ) (MEM2 X (CDR L))) ) )

Page 72: Funkcionālā programmēšana (DIP330)

72RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvās funkcijasRekursīvās funkcijasno diviem sarakstiem (1)no diviem sarakstiem (1)

• Kā tiek noteikta funkcija APPEND– apvieno divus sarakstus(DEFUN APPEND (L M) (COND((NULL L) M)(T (CONS (CAR L) (APPEND (CDR L)

M ) ))) )

(APPEND L M ) ja L ir (1 2 3) un M ir (4 5 6)

Page 73: Funkcionālā programmēšana (DIP330)

73RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvās funkcijasRekursīvās funkcijasno diviem sarakstiem (2)no diviem sarakstiem (2)

• Noteiksim funkciju EQUAL– argumenti var būt saraksti ar

apakšsarakstiem – ar funkcijas EQ palīdzību

• argumenti tikai atomi

– saraksti L un M ir vienādi, ja• vienādi ir to pirmie elementi (CAR L) un (CAR M)• un vienādas arī atlikušās sarakstu daļas (CDR L)

un (CDR M)• jābūt vienādiem abiem šiem pāriem

Page 74: Funkcionālā programmēšana (DIP330)

74RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursīvās funkcijasRekursīvās funkcijasno diviem sarakstiem (3)no diviem sarakstiem (3)

(DEFUN EQUAL (L M) (COND((NULL L) NULL M))((ATOM L) (AND (ATOM M) (EQ L M)))((ATOM M) NIL)(T (AND (EQUAL (CAR L) (CAR M)) (EQUAL (CDR L) (CDR M))) )) )

Page 75: Funkcionālā programmēšana (DIP330)

75RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas tipu izzināšanai (1)Funkcijas tipu izzināšanai (1)

• Predikāts NUMBERP– viens arguments– predikāta vērtība ir T, ja argumentam ir

skaitliska vērtība– ja X ir 5, tad (NUMBERP X) ir T– ja X ir simboli ABC, tad (NUMBERP X) ir

NIL– ja X ir (1 2 3), tad (NUMBERP X) ir NIL

Page 76: Funkcionālā programmēšana (DIP330)

76RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas tipu izzināšanai (2)Funkcijas tipu izzināšanai (2)

• Funkcijas FIXP un FLOATP– viens arguments– FIXP vērtība ir T, ja arguments ir skaitlis ar

fiksētu punktu– FLOATP vērtība ir T, ja arguments ir

skaitlis ar peldošu punktu– ja X ir 7, tad (FIXP X) ir T, bet (FLOATP

X) ir NIL– ja X ir 7.5, tad (FIXP X) ir NIL, bet

(FLOATP X) ir T

Page 77: Funkcionālā programmēšana (DIP330)

77RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas tipu izzināšanai (3)Funkcijas tipu izzināšanai (3)

• Noteiksim funkciju COUNTFIXFLOAT– funkcijas arguments ir saraksts L– funkcijas vērtība būs saraksts no diviem

elementiem• pirmais elements – ciparu skaits formā ar

fiksētu punktu• otrais - ciparu skaits ar peldošu punktu

– ja X ir (T LAM 5.6 3(8((9.1 4.122 J)B 6 3.1 R)), tad

– (COUNTFIXFLOAT X) ir (3 4)

Page 78: Funkcionālā programmēšana (DIP330)

78RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas tipu izzināšanai (4)Funkcijas tipu izzināšanai (4)

(DEFUN COUNTFIXFLOAT (L) (COND((NULL L) (QUOTE (0 0)))((ATOM L) (COND ((FIXP L) (QUOTE (1 0))) ((FLOATP L) (QUOTE (0

1))) (T (QUOTE (0 0))) )(T (SUM2 (COUNTFIXFLOAT (CAR L)) (COUNTFIXFLOAT (CDR L))) ) ))

Page 79: Funkcionālā programmēšana (DIP330)

79RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas tipu izzināšanai (5)Funkcijas tipu izzināšanai (5)

(DEFUN SUM2 (L M)(CONS (+ (CAR L) (CAR M)) (LIST (+ (CADR L) (CADR M)))))

ja X ir (4 3), bet Y ir (7 2), tad(SUM2 X Y) ir (11 5)

Page 80: Funkcionālā programmēšana (DIP330)

80RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (1)PROG-izteiksmes (1)

• Secīgu operatoru veids• Pārveido funkcionālo pierakstu uz

nefunkcionālo pierakstu– realizē algoritmiskās valodās jēdzienus:

• apraksti• operatori• iezīmes• vadības nodošana• nosacījuma izteiksmes• vērtību atgriešana

Page 81: Funkcionālā programmēšana (DIP330)

81RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (2)PROG-izteiksmes (2)

• Apraksti– pirmais funkcijas PROG arguments

• mainīgo saraksts, kuri tiks izmantoti dotajā PROG

– parametri netiek ieslēgti šajā sarakstā– mainīgā tips netiek noteikts

• atkarīgs no piešķirtas vērtības

– mainīgo vērtībām jābūt noteiktām, līdz to lietošanas momentam

– mainīgie var būt saraksti• var izmantot masīvu vietā

Page 82: Funkcionālā programmēšana (DIP330)

82RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (3)PROG-izteiksmes (3)

• Operatori– piešķirta PROG argumentu loma– SETQ un SET tipa izteiksmes

• Iezīmes– piešķirta PROG argumentu loma– vienmēr atsevišķs atoms

•atšķiras no griešanās pie funkcijām

Page 83: Funkcionālā programmēšana (DIP330)

83RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (4)PROG-izteiksmes (4)

• Ir trīs tipu PROG argumenti:– pirmais arguments

•PROG-mainīgo saraksts

– operatori•lai grieztos pie funkcijām

– Iezīmes

• Argumentu skaits ir neierobežots

Page 84: Funkcionālā programmēšana (DIP330)

84RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (5)PROG-izteiksmes (5)

• Vadības nodošana– operators GO– vienīgais arguments ir iezīme– (GO SIGMA)

•nozīmē vadības nodošanu uz iezīmi SIGMA

•operatoram, kurš seko tūlīt pēc šīs iezīmes

Page 85: Funkcionālā programmēšana (DIP330)

85RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-izteiksmes (6)PROG-izteiksmes (6)

• Nosacījuma izteiksmes– funkcija COND– divas atšķirības no izmantošanas funkcijās

• pāra otrais elements nav lielums, bet ir operators– jebkura tipa

• pēdējam pārim nav obligāti jāsākas ar T– Tas ir analoģiski operatoram IF-THEN bez ELSE daļas

• Vērtības atgriešana– funkcija RETURN– viens arguments– PROG-izteiksmes vērtība

Page 86: Funkcionālā programmēšana (DIP330)

86RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

FaktoriālsFaktoriāls

• Variants algoritmiska valodā:INTEGER FUNCTION FACT(N)I=NJ=1

1 IF (I .EQ. 0) GOTO 2J=J*II=I-1GOTO 1

2 FACT=JRETURNEND

Page 87: Funkcionālā programmēšana (DIP330)

87RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG-faktoriālsPROG-faktoriāls

• Variants valodā LISP:(DEFUN FACT (N) (PROG (I J)(SETQ I N) (SET J 1)K (COND ((ZEROP I) (GO L)))(SETQ J (* J I))(SETQ I (- I 1))(GO K)L (RETURN J) ))

Page 88: Funkcionālā programmēšana (DIP330)

88RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Sarakstu apstrāde (1)PROG. Sarakstu apstrāde (1)

• Tas nav saraksts, bet gan drīzāk viendimensijas masīvs

• Indekss– mainās ar vieninieku, lai pārietu uz nākošo

masīva elementu• funkcija CDR izsvītro pirmo saraksta elementu

– algoritmiskā valodā:S=0DO 1 I=1,100

1 S=S+A(I)

Page 89: Funkcionālā programmēšana (DIP330)

89RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Sarakstu apstrāde (2)PROG. Sarakstu apstrāde (2)

• Pārrakstīsim funkciju ADD, izmantojot PROG-izteiksmes

(DEFUN ADD (L) (PROG (M N)(SETQ M L) (SETQ N 0)A (COND ((NULL M) (RETURN N)))(SETQ N (+ N (CAR M)))(SETQ M (CDR M)) (GO A) ))• Nav tik efektīva un “caurspīdīga” kā

rekursīvā

Page 90: Funkcionālā programmēšana (DIP330)

90RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Sarakstu veidošana (1)PROG. Sarakstu veidošana (1)

• Pats efektīvākais saraksta apstrādes veids– apstrāde no sākuma– CAR un CDR

• Veidot sarakstu visefektīvāk no beigām– pēdējo elementu jāizskaitļo pirmo– jauni elementi jāpievieno saraksta sākumā– pirmo saraksta elementu jāizskaitļo pēdējo– CONS

Page 91: Funkcionālā programmēšana (DIP330)

91RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Sarakstu veidošana (2)PROG. Sarakstu veidošana (2)

• Noteiksim programmu REVERSE– pārraksta sarakstu apgrieztā kartībā

(DEFUN REVERSE (L) (PROG (M P)(SETQ M L) (SETQ P NIL)A(COND (( NULL M) (RETURN P)))(SETQ P (CONS (CAR M) P))(SETQ M (CDR M)) (GO A) ))

Page 92: Funkcionālā programmēšana (DIP330)

92RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Sarakstu veidošana (3)PROG. Sarakstu veidošana (3)

• Izveidošana it kā no sākuma• Noteiksim funkciju DOUBLE

– dubulto katru veselu skaitli no veselu skaitļu saraksta

(DEFUN DOUBLE (X) (COND ((NULL X) X)(T (CONS (+ (CAR X)(CAR X))

(DOUBLE (CDR X))) ) ) )

Page 93: Funkcionālā programmēšana (DIP330)

93RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas darbība (1)Funkcijas darbība (1)

• Divdimensiju masīvs - sarakstu saraksts– vieninieku matrica δij NxN,

•δij = 1, ja i=j un•δij = 0, ja i nav = j,•kur 1<= i, j <=N

– N=4 • ( (1 0 0 0) (0 1 0 0) (0 0 1 0) (0 0 0

1) )

Page 94: Funkcionālā programmēšana (DIP330)

94RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas darbība (2)Funkcijas darbība (2)

• Noteiksim funkciju UNITMATR– (UNITMATR N) rezultāts ir vieninieku

masīvs NxN(DEFUN UNITMATR (N) (PROG (I J K L

Z)I - matricas rindas kārtas numursJ - matricas stabiņa kārtas numursK - saraksts, kurš atbilst tekošai rindaiL - rezultējošā matricaZ - tekošais matricas rindas elements

Page 95: Funkcionālā programmēšana (DIP330)

95RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkcijas darbība (3)Funkcijas darbība (3)

(SETQ I N) (SETQ L NIL)A (SETQ J N) (SETQ K NIL)B (COND ((EQUAL I J)(SETQ Z 1))

(T (SETQ Z 0)) )(SETQ K (CONS Z K)) (SETQ J (- J 1))(COND ((> J 0)(GO B)))(SETQ L (CONS K L) (SETQ I (- I 1))(COND ((> I 0)(GO A)))(RETURN L) ))

Page 96: Funkcionālā programmēšana (DIP330)

96RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programmas saīsināšanaProgrammas saīsināšana

• Izmantot funkciju vienlaicīgi gan darbību izpildei, gan vērtības iegūšanai– nomainīt divus operatorus

(SETQ J (- J 1)) (COND ((> J 0) (GO B)))

– uz vienu operatoru(COND ((> (SETQ J (- J 1)) 0) (GO B)))• atņemt 1 no vērtības J• iegūt jaunu J vērtību• pārbaudīt jaunu J vērtību

Page 97: Funkcionālā programmēšana (DIP330)

97RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Predikāti (1)PROG. Predikāti (1)

• Jāatgriež T vienā vietā un NIL citā– pie kam var būt vairāki RETURN operatori

vienā PROG- izteiksmē• Piemērs

– Predikāta arguments ir saraksts, kurš attēlo spēļu kārtis

– Katra kārts tiek attēlota ar sarakstu, sastāvošu no diviem elementiem• masts• lielums• (Pīķa dūzis) (Kārava 10) (Kreiča 5)

Page 98: Funkcionālā programmēšana (DIP330)

98RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Predikāti (2)PROG. Predikāti (2)

• Noteiksim funkciju PIKUNAV(DEFUN PIKUNAV (L) (PROG (M P)

(SETQ M L)A (COND ((NULL M) (RETURN T))) (SETQ P (CAR M)) (SETQ M (CDR

M)) (COND ((EQUAL (CAR P) ‘Pīķa)

(RETURN NIL))) (GO A) ))

Page 99: Funkcionālā programmēšana (DIP330)

99RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

RekursijaRekursija

• PIKUNAV funkcionālā veida(DEFUN PIKUNAV (L) (COND((NULL L) T)(T (AND (NOT (EQUAL (CAAR L) ‘Pīķa)) (PIKUNAV (CDR L))) )) )

Page 100: Funkcionālā programmēšana (DIP330)

100RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

PROG. Predikāti (3)PROG. Predikāti (3)

(DEFUN ERCENU_VAIRĀK_KĀ_PĪKU (L) (PROG ( M P X Y) ;X,Y - ercenu pīķu skaits

(SETQ M L) (SETQ X 0) (SETQ Y 0)A (COND ((NULL M) (RETURN (> X Y))))

(SETQ P (CAR M)) (SETQ M (CDR M))(COND ((EQUAL (CAR P) ‘Ercena)

(SETQ X (+ X 1)) ) ((EQUAL (CAR P) ‘Pīķa )

(SETQ Y (+ Y 1)) ) )(GO A) ))

Page 101: Funkcionālā programmēšana (DIP330)

101RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

RekursijaRekursija

• Funkcionālā veida(DEFUN ERCENU_VAIRĀK_KĀ_PĪKU (L)(> (PIKI L) (ERCENI L)) )(DEFUN PIKI (L) (COND((NULL L) 0)((EQUAL (CAAR L) ‘Pīķa) (+ 1 (PIKI

(CDR L))))(T(PIKI (CDR L))) ))(DEFUN ERCENI (L) ...

Page 102: Funkcionālā programmēšana (DIP330)

102RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Rekursija PROG-izteiksmēsRekursija PROG-izteiksmēs

• Apakšsarakstu apstrāde(DEFUN ADD2 (L) (PROG (M N X)

(SETQ M L) (SETQ N 0)A (COND ((NULL M) (RETURN N)))

(SETQ X (CAR M)) (SETQ M (CDR M))(COND ((ATOM X) (SETQ N (+ N X)))

(T (SETQ N (+ N (ADD2 X)))))

(GO A) ))

Page 103: Funkcionālā programmēšana (DIP330)

103RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

SaīsināšanaSaīsināšana

• Iepriekšējais variants(COND ((ATOM X) (SETQ N (+ N

X)))(T (SETQ N (+ N (ADD2

X)))))

• Īsāk(SETQ N (+ N (COND ((ATOM X) X)

(T (ADD2 X)) )))

Page 104: Funkcionālā programmēšana (DIP330)

104RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Apakšsarakstu apstrādeApakšsarakstu apstrāde

• Noteiksim funkciju ADD3– arguments ir apakšsarakstu saraksts– vērtība - katra apakšsaraksta elementu

summa atsevišķi– ja X ir ((2 4)(3 1)(6 2)), tad (ADD3 X) ir

(6 4 8)

(DEFUN ADD3 (L) (COND (( NULL L) NIL)(CONS (ADD2 (CAR L)) (ADD3 (CDR

L))) ))

Page 105: Funkcionālā programmēšana (DIP330)

105RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju apvienošana (1)Funkciju apvienošana (1)

(COND ((ZEROP K) (PROG NIL (SETQ Y X) (SETQ Z X)) ))

(COND ((ZEROP K) (PROGN (SETQ Y X) (SETQ Z X)) ))

K=0

Y = X

Z = X

Page 106: Funkcionālā programmēšana (DIP330)

106RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju apvienošana (2)Funkciju apvienošana (2)

• Noteiksim funkciju OPPMAX– argumenti

• skaitļu saraksts L• simbolu saraksts M

– vērtība - saraksta M elements, kurš pēc sava stāvokļa atbilst maksimālajam elementam no saraksta L

– ja L ir (3 7 13 9) un M ir (T E S T), tad (OPPMAX L M) ir S

Page 107: Funkcionālā programmēšana (DIP330)

107RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju apvienošana (3)Funkciju apvienošana (3)

(DEFUN OPPMAX (L M) (PROG (A B U V Y Z)

A - kandidāts uz maksimālo elementusākotnēji saraksta L pirmais elements

B - atbilstošais sarakstā M elementssākotnēji arī pirmais

Ja tiek atrasts elements, kurš ir lielāks par A, tad jaunu vērtību iegūst gan A gan B

Page 108: Funkcionālā programmēšana (DIP330)

108RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Funkciju apvienošana (4)Funkciju apvienošana (4)

(SETQ A (CAR L)) (SETQ B (CAR M))(SETQ U (CDR L)) (SETQ V (CDR M))

G (COND ((NULL U) (RETURN B)))(SETQ Y (CAR U)) (SETQ Z (CAR V))(SETQ U (CDR U)) (SETQ V (CDR V))(COND ((> Y A)

(PROGN (SETQ A Y)(SETQ B Z)) ))(GO G) ))

Page 109: Funkcionālā programmēšana (DIP330)

109RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļošanas noteikums (1)Izskaitļošanas noteikums (1)

(SETQ Z 3)(SETQ Y (+ Z (SETQ Z 6)));y=3+6=9(SETQ Y (+ (SETQ Z 6) Z)))

;y=6+6=12• Funkcijas izskaitļošanas noteikums

– lai izskaitļotu funkciju, tās argumenti gan atomi, gan griešanas pie funkcijām, tiek izskaitļoti pēc kārtas no kreisās uz labo

– pēc tam funkcijas definīcija tiek pielietota šim vērtību sarakstam

Page 110: Funkcionālā programmēšana (DIP330)

110RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļošanas noteikums (2)Izskaitļošanas noteikums (2)

• AND un OR izskaitļotas citādā veidā– (AND X Y ...)

• vērtība ir ne NIL, ja visi argumenti ir ne NIL• ja X ir NIL, tad (AND X Y) vērtībai ir jābūt

NIL• nav nepieciešams izskaitļot Y• tas ne tikai saīsina laiku, bet arī aizsargā no

kļūdu rašanās• (AND (ATOM M)(EQ L M)) ; pareizi• (AND (EQ L M) (ATOM M)) ; kļūdaini

Page 111: Funkcionālā programmēšana (DIP330)

111RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļošanas noteikums (3)Izskaitļošanas noteikums (3)

–(OR X Y ...)•vērtība ir ne NIL, ja ik viens arguments ir ne NIL

•ja X ir ne NIL, tad (OR X Y) vērtībai ir jābūt ne NIL

•nav nepieciešams izskaitļot Y•saīsina laiku

Page 112: Funkcionālā programmēšana (DIP330)

112RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļojoša funkcija (1)Izskaitļojoša funkcija (1)

• Ja ir mainīgais, kura vērtība ir saraksts• Ja saraksts var saprast, ka griešanās

pie funkcijas– par pirmo elementu kalpo funkcijas vārds– citi elementi ir tās funkcijas argumenti

• Lai atrastu šīs funkcijas vērtību, jālieto funkciju EVAL

• Ja X ir (+ 2 3), tad (EVAL X) ir 5

Page 113: Funkcionālā programmēšana (DIP330)

113RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļojoša funkcija (2)Izskaitļojoša funkcija (2)

• Ar EVAL palīdzību var izpildīt operatoru– kuru ir izveidojusi paša LISP- programma– kurš var mainīties programmas izpildes

procesā

• Noteikt funkciju– mainīgais NAME – funkcijas nosaukums– mainīgais PARAMETERLIST - šīs funkcijas

parametru saraksts– mainīgais DESCRIPTION – šis funkcijas apraksts

Page 114: Funkcionālā programmēšana (DIP330)

114RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļojoša funkcija (3)Izskaitļojoša funkcija (3)

(EVAL (LIST ‘DEFUN NAME PARAMETERLIST

DESCRIPTION ))• Funkcija LIST izveido sarakstu formā (DEFUN

n p d), – kur n, p un d – ir mainīgajos NAME,

PARAMETERLIST un DESCRIPTION atbilstošā vērtība

• Pēc tam šis saraksts tiek izskaitļots – tiks definēta jauna funkcija

Page 115: Funkcionālā programmēšana (DIP330)

115RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Izskaitļojoša funkcija (4)Izskaitļojoša funkcija (4)

• Ja NAME ir simbolu rinda “DIFFERENCE”

• ja PARAMETERLIST ir (X Y) - ir saraksts no burtiem X un Y

• ja DESCRIPTION ir saraksts (PLUS X (MINUS Y))

• tad augstāk minētā EVAL izpilde kalpos funkcijas DIFFERENCE noteikšanai

Page 116: Funkcionālā programmēšana (DIP330)

116RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (1)Programma kā dati (1)

• Programma ir sarakstu struktūra• Izmantosim mainīgos, kuru vērtības būs

programmas dažādas sastāvdaļas• Izskatīsim funkciju

(FOR I J K L DESCR)– kura atbilst operatoram

for I:=J step K until L do DESCR;

Page 117: Funkcionālā programmēšana (DIP330)

117RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (2)Programma kā dati (2)

• Funkcijas (FOR I J K L DESCR) vērtībai jābūt :

( ( SETQ I J)B (COND ((> I L) (GO A)))

descr (SETQ I (+ I K)) (GO B)

A )kur descr – mainīgā DESCR vērtība

• Būtiska problēma - iezīmes B un A

Page 118: Funkcionālā programmēšana (DIP330)

118RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (3)Programma kā dati (3)

• Iezīmes B un A problēma– nav iespējams garantēt, ka simboli B un A netiks

izmantoti kā iezīmes programmas daļā, kuru ietver DESCR

– Ir iespējams izsaukt FOR vairākas reizes vienā programmā

– tas novedīs pie atkārtoti noteiktām iezīmēm– šī problēma tiek risināta ar valoda LISP funkcijas

GENSYM• funkcija bez argumentiem• ģenerē atomus, kuri atšķiras no atomiem, kuri

tika iegūti ar tās palīdzību agrāk

Page 119: Funkcionālā programmēšana (DIP330)

119RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (4)Programma kā dati (4)

(DEFUN FOR (I J K L D) (PROG (W X Y Z)(SETQ X (APPEND D (LIST (LIST ‘SETQ I

(LIST ‘+ I K)))))

(SETQ Y (GENSYM)) (SETQ Z (GENSYM))(SETQ X (APPEND X (LIST (LIST ‘GO Y) Z) ))(SETQ W (LIST (LIST ‘SETQ I J)

Y (LIST ‘COND (LIST (LIST ‘> I L) (LIST ‘GO Z )))))

(RETURN (APPEND W X)) ))

;W - veidojamās programmas pirmā daļa, X – otrā daļa

Page 120: Funkcionālā programmēšana (DIP330)

120RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (5)Programma kā dati (5)

• Funkcijas (FOR ‘N 1 2 100 ‘((PRINT N))) rezultāts(SETQ X (APPEND D

(LIST (LIST ‘SETQ I (LIST ‘+

I K) ) ) ) ) X iegūs vērtību((PRINT N) (SETQ N (+ N 2 )))

Page 121: Funkcionālā programmēšana (DIP330)

121RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (6)Programma kā dati (6)

• Funkcijas (FOR ‘N 1 2 100 ‘((PRINT N))) rezultāts

(SETQ Y (GENSYM))(SETQ Z (GENSYM))Y iegūs vērtību “Gen1”Z iegūs vērtību “Gen2”

Page 122: Funkcionālā programmēšana (DIP330)

122RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (7)Programma kā dati (7)

• Funkcijas (FOR ‘N 1 2 100 ‘((PRINT N))) rezultāts

(SETQ X (APPEND X (LIST (LIST ‘GO Y) Z)

) )X iegūs vērtību((PRINT N) (SETQ N (+ N 2 )) (GO

Gen1) Gen2)

Page 123: Funkcionālā programmēšana (DIP330)

123RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (8)Programma kā dati (8)

• Funkcijas (FOR ‘N 1 2 100 ‘((PRINT N))) rezultāts(SETQ W (LIST (LIST ‘SETQ I J)

Y (LIST ‘COND (LIST (LIST ‘> I L) (LIST ‘GO Z )

) ) ) )W iegūs vērtību( (SETQ N 1) Gen1 (COND ((> N 100)(GO Gen2))) )

Page 124: Funkcionālā programmēšana (DIP330)

124RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (9)Programma kā dati (9)

• Funkcijas (FOR ‘N 1 2 100 ‘((PRINT N))) rezultāts(RETURN (APPEND W X))Funkcija FOR iegūs vērtību

( (SETQ N 1)Gen1 (COND ((> N 100) (GO Gen2)))

(PRINT N) (SETQ N (+ N 2 )) (GO Gen1 )

Gen2)

Page 125: Funkcionālā programmēšana (DIP330)

125RTU akadēmiskās studiju programmas “Datorsistēmas” kursu pilnveidošana2005/0125/VPD1/ESF/PIAA/ 04/APK/3.2.3.2/0062/0007

V. Šitikovs. Funkcionālā programmēšana

Programma kā dati (10)Programma kā dati (10)

• Funkcijas FOR rezultāts ir saraksta veida struktūra, kas atbilst programmai

• Lai izpildītu šo programmu, jāgriežas pie funkcijas EVAL

(EVAL (FOR ‘N 1 2 100 ‘((PRINT N))) )