1.25k likes | 1.41k Vues
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.
E N D
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana Priekš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
V. Šitikovs. Funkcionālā programmēšana Priekš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.
V. Šitikovs. Funkcionālā programmēšana Pamatliteratū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.
V. Šitikovs. Funkcionālā programmēšana Papildliteratū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.
V. Šitikovs. Funkcionālā programmēšana Atslē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
V. Šitikovs. Funkcionālā programmēšana 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.
V. Šitikovs. Funkcionālā programmēšana 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.
V. Šitikovs. Funkcionālā programmēšana 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.
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana Ievads (3) • LISP • saīsinājums no LISt Processing - sarakstu apstrādāšana • nealgoritmiska programmēšanas valoda • funkcionāla programmēšanas valoda
V. Šitikovs. Funkcionālā programmēšana Ievads (4)
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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)
V. Šitikovs. Funkcionālā programmēšana 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))
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana Valodas apraksts (4) • Rezervēti identifikatori • T - patiess (true), • F - nepatiess (false), • NIL - tukšums, kurš bieži tiek lietots “nepatiess” vietā
V. Šitikovs. Funkcionālā programmēšana 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)
V. Šitikovs. Funkcionālā programmēšana 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 • JaX 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
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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šanau.t.t. • tiek noteikti ar speciālu funkciju palīdzību
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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)
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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)
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana Rekursija • 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)
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana Funkciju izveidošana (3) • Parametri • formālie • tiek lietoti funkcijas aprakstam • tikai identifikatori • faktiskie • lai grieztos pie funkcijas • var būt izteiksmes
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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)
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana Funkcijas sarakstu apstrādei (3) • CDR • arguments ir saraksts • vērtība ir saraksta atlikums bez pirmaelementa • 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)
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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)
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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.
V. Šitikovs. Funkcionālā programmēšana 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))))
V. Šitikovs. Funkcionālā programmēšana 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)
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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 Xir (1 2 3), tad (ATOM X) ir NIL
V. Šitikovs. Funkcionālā programmēšana 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
V. Šitikovs. Funkcionālā programmēšana 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