diff options
author | Franciszek Malinka <franciszek.malinka@gmail.com> | 2021-02-25 14:42:55 +0100 |
---|---|---|
committer | Franciszek Malinka <franciszek.malinka@gmail.com> | 2021-02-25 14:42:55 +0100 |
commit | 9477dbe667f250ecd23f8fc0d56b942191526421 (patch) | |
tree | a4b50c9a726f415f835f5311c11c5d66e95f688c /Semestr 2 | |
parent | 1968c1e590077bd51844eacfac722d7963848cb8 (diff) |
Stare semestry, niepoukladane
Diffstat (limited to 'Semestr 2')
289 files changed, 14369 insertions, 0 deletions
diff --git a/Semestr 2/algebra/106131081_1151103648602701_2043131207718798221_n.jpg b/Semestr 2/algebra/106131081_1151103648602701_2043131207718798221_n.jpg Binary files differnew file mode 100644 index 0000000..b0e2f4e --- /dev/null +++ b/Semestr 2/algebra/106131081_1151103648602701_2043131207718798221_n.jpg diff --git a/Semestr 2/algebra/32.jpg b/Semestr 2/algebra/32.jpg Binary files differnew file mode 100644 index 0000000..8f66fb0 --- /dev/null +++ b/Semestr 2/algebra/32.jpg diff --git a/Semestr 2/algebra/33.jpg b/Semestr 2/algebra/33.jpg Binary files differnew file mode 100644 index 0000000..200d044 --- /dev/null +++ b/Semestr 2/algebra/33.jpg diff --git a/Semestr 2/algebra/34.jpg b/Semestr 2/algebra/34.jpg Binary files differnew file mode 100644 index 0000000..39bb45c --- /dev/null +++ b/Semestr 2/algebra/34.jpg diff --git a/Semestr 2/algebra/35.jpg b/Semestr 2/algebra/35.jpg Binary files differnew file mode 100644 index 0000000..ce2008c --- /dev/null +++ b/Semestr 2/algebra/35.jpg diff --git a/Semestr 2/algebra/36.jpg b/Semestr 2/algebra/36.jpg Binary files differnew file mode 100644 index 0000000..b776d30 --- /dev/null +++ b/Semestr 2/algebra/36.jpg diff --git a/Semestr 2/algebra/37.jpg b/Semestr 2/algebra/37.jpg Binary files differnew file mode 100644 index 0000000..18d9384 --- /dev/null +++ b/Semestr 2/algebra/37.jpg diff --git a/Semestr 2/algebra/38.jpg b/Semestr 2/algebra/38.jpg Binary files differnew file mode 100644 index 0000000..1b90aee --- /dev/null +++ b/Semestr 2/algebra/38.jpg diff --git a/Semestr 2/algebra/39.jpg b/Semestr 2/algebra/39.jpg Binary files differnew file mode 100644 index 0000000..6fa2ebb --- /dev/null +++ b/Semestr 2/algebra/39.jpg diff --git a/Semestr 2/algebra/40.jpg b/Semestr 2/algebra/40.jpg Binary files differnew file mode 100644 index 0000000..64c2a62 --- /dev/null +++ b/Semestr 2/algebra/40.jpg diff --git a/Semestr 2/algebra/41.jpg b/Semestr 2/algebra/41.jpg Binary files differnew file mode 100644 index 0000000..f160777 --- /dev/null +++ b/Semestr 2/algebra/41.jpg diff --git a/Semestr 2/algebra/42.jpg b/Semestr 2/algebra/42.jpg Binary files differnew file mode 100644 index 0000000..e8de627 --- /dev/null +++ b/Semestr 2/algebra/42.jpg diff --git a/Semestr 2/algebra/43.jpg b/Semestr 2/algebra/43.jpg Binary files differnew file mode 100644 index 0000000..ceffb0c --- /dev/null +++ b/Semestr 2/algebra/43.jpg diff --git a/Semestr 2/algebra/44.jpg b/Semestr 2/algebra/44.jpg Binary files differnew file mode 100644 index 0000000..6237e6c --- /dev/null +++ b/Semestr 2/algebra/44.jpg diff --git a/Semestr 2/algebra/45.jpg b/Semestr 2/algebra/45.jpg Binary files differnew file mode 100644 index 0000000..1ec6cf1 --- /dev/null +++ b/Semestr 2/algebra/45.jpg diff --git a/Semestr 2/algebra/46.jpg b/Semestr 2/algebra/46.jpg Binary files differnew file mode 100644 index 0000000..c2cbcc0 --- /dev/null +++ b/Semestr 2/algebra/46.jpg diff --git a/Semestr 2/algebra/47.jpg b/Semestr 2/algebra/47.jpg Binary files differnew file mode 100644 index 0000000..7a4a73c --- /dev/null +++ b/Semestr 2/algebra/47.jpg diff --git a/Semestr 2/algebra/48.jpg b/Semestr 2/algebra/48.jpg Binary files differnew file mode 100644 index 0000000..d27be3d --- /dev/null +++ b/Semestr 2/algebra/48.jpg diff --git a/Semestr 2/algebra/49.jpg b/Semestr 2/algebra/49.jpg Binary files differnew file mode 100644 index 0000000..4a626d9 --- /dev/null +++ b/Semestr 2/algebra/49.jpg diff --git a/Semestr 2/algebra/50.jpg b/Semestr 2/algebra/50.jpg Binary files differnew file mode 100644 index 0000000..06f0fe4 --- /dev/null +++ b/Semestr 2/algebra/50.jpg diff --git a/Semestr 2/algebra/DodatkoweWytłumaczenieDlaKogośKomuNieCheilibyśmyUdzielaćKorepetycji.jpg b/Semestr 2/algebra/DodatkoweWytłumaczenieDlaKogośKomuNieCheilibyśmyUdzielaćKorepetycji.jpg Binary files differnew file mode 100644 index 0000000..48546c1 --- /dev/null +++ b/Semestr 2/algebra/DodatkoweWytłumaczenieDlaKogośKomuNieCheilibyśmyUdzielaćKorepetycji.jpg diff --git a/Semestr 2/algebra/FraMalEgzamin.pdf b/Semestr 2/algebra/FraMalEgzamin.pdf Binary files differnew file mode 100644 index 0000000..a4d4941 --- /dev/null +++ b/Semestr 2/algebra/FraMalEgzamin.pdf diff --git a/Semestr 2/algebra/egzamin/z1a.jpg b/Semestr 2/algebra/egzamin/z1a.jpg Binary files differnew file mode 100644 index 0000000..6bca7ce --- /dev/null +++ b/Semestr 2/algebra/egzamin/z1a.jpg diff --git a/Semestr 2/algebra/egzamin/z1b.jpg b/Semestr 2/algebra/egzamin/z1b.jpg Binary files differnew file mode 100644 index 0000000..23fa274 --- /dev/null +++ b/Semestr 2/algebra/egzamin/z1b.jpg diff --git a/Semestr 2/algebra/egzamin/z2a.jpg b/Semestr 2/algebra/egzamin/z2a.jpg Binary files differnew file mode 100644 index 0000000..81a90c2 --- /dev/null +++ b/Semestr 2/algebra/egzamin/z2a.jpg diff --git a/Semestr 2/algebra/egzamin/z2b.jpg b/Semestr 2/algebra/egzamin/z2b.jpg Binary files differnew file mode 100644 index 0000000..510ca22 --- /dev/null +++ b/Semestr 2/algebra/egzamin/z2b.jpg diff --git a/Semestr 2/algebra/egzamin/z2c.jpg b/Semestr 2/algebra/egzamin/z2c.jpg Binary files differnew file mode 100644 index 0000000..361dae8 --- /dev/null +++ b/Semestr 2/algebra/egzamin/z2c.jpg diff --git a/Semestr 2/algebra/egzamin/z4a.jpg b/Semestr 2/algebra/egzamin/z4a.jpg Binary files differnew file mode 100644 index 0000000..c1a480e --- /dev/null +++ b/Semestr 2/algebra/egzamin/z4a.jpg diff --git a/Semestr 2/algebra/egzamin/z4b.jpg b/Semestr 2/algebra/egzamin/z4b.jpg Binary files differnew file mode 100644 index 0000000..85c70c0 --- /dev/null +++ b/Semestr 2/algebra/egzamin/z4b.jpg diff --git a/Semestr 2/algebra/egzamin/z4c.jpg b/Semestr 2/algebra/egzamin/z4c.jpg Binary files differnew file mode 100644 index 0000000..2196e19 --- /dev/null +++ b/Semestr 2/algebra/egzamin/z4c.jpg diff --git a/Semestr 2/algebra/egzamin/z5a.jpg b/Semestr 2/algebra/egzamin/z5a.jpg Binary files differnew file mode 100644 index 0000000..b12f4b3 --- /dev/null +++ b/Semestr 2/algebra/egzamin/z5a.jpg diff --git a/Semestr 2/algebra/egzamin/z5b.jpg b/Semestr 2/algebra/egzamin/z5b.jpg Binary files differnew file mode 100644 index 0000000..50f4883 --- /dev/null +++ b/Semestr 2/algebra/egzamin/z5b.jpg diff --git a/Semestr 2/algebra/egzamin/z6.jpg b/Semestr 2/algebra/egzamin/z6.jpg Binary files differnew file mode 100644 index 0000000..3ab55a0 --- /dev/null +++ b/Semestr 2/algebra/egzamin/z6.jpg diff --git a/Semestr 2/algebra/egzamin/z6a.jpg b/Semestr 2/algebra/egzamin/z6a.jpg Binary files differnew file mode 100644 index 0000000..7af963e --- /dev/null +++ b/Semestr 2/algebra/egzamin/z6a.jpg diff --git a/Semestr 2/algebra/egzamin/z6b.jpg b/Semestr 2/algebra/egzamin/z6b.jpg Binary files differnew file mode 100644 index 0000000..3c5c3e3 --- /dev/null +++ b/Semestr 2/algebra/egzamin/z6b.jpg diff --git a/Semestr 2/algebra/egzamin/z6c.jpg b/Semestr 2/algebra/egzamin/z6c.jpg Binary files differnew file mode 100644 index 0000000..f46689f --- /dev/null +++ b/Semestr 2/algebra/egzamin/z6c.jpg diff --git a/Semestr 2/algebra/kolokwium/zad1.jpg b/Semestr 2/algebra/kolokwium/zad1.jpg Binary files differnew file mode 100644 index 0000000..f8fa7be --- /dev/null +++ b/Semestr 2/algebra/kolokwium/zad1.jpg diff --git a/Semestr 2/algebra/kolokwium/zad2.jpg b/Semestr 2/algebra/kolokwium/zad2.jpg Binary files differnew file mode 100644 index 0000000..7c92bf4 --- /dev/null +++ b/Semestr 2/algebra/kolokwium/zad2.jpg diff --git a/Semestr 2/algebra/kolokwium/zad2cd.jpg b/Semestr 2/algebra/kolokwium/zad2cd.jpg Binary files differnew file mode 100644 index 0000000..692419a --- /dev/null +++ b/Semestr 2/algebra/kolokwium/zad2cd.jpg diff --git a/Semestr 2/algebra/kolokwium/zad3.jpg b/Semestr 2/algebra/kolokwium/zad3.jpg Binary files differnew file mode 100644 index 0000000..1f5304c --- /dev/null +++ b/Semestr 2/algebra/kolokwium/zad3.jpg diff --git a/Semestr 2/algebra/kolokwium/zad4.jpg b/Semestr 2/algebra/kolokwium/zad4.jpg Binary files differnew file mode 100644 index 0000000..f04662a --- /dev/null +++ b/Semestr 2/algebra/kolokwium/zad4.jpg diff --git a/Semestr 2/algebra/kolokwium/zad6.jpg b/Semestr 2/algebra/kolokwium/zad6.jpg Binary files differnew file mode 100644 index 0000000..be3acea --- /dev/null +++ b/Semestr 2/algebra/kolokwium/zad6.jpg diff --git a/Semestr 2/algebra/lista10/66.png b/Semestr 2/algebra/lista10/66.png Binary files differnew file mode 100644 index 0000000..da66007 --- /dev/null +++ b/Semestr 2/algebra/lista10/66.png diff --git a/Semestr 2/algebra/lista10/67.png b/Semestr 2/algebra/lista10/67.png Binary files differnew file mode 100644 index 0000000..a3992f9 --- /dev/null +++ b/Semestr 2/algebra/lista10/67.png diff --git a/Semestr 2/algebra/lista10/68.png b/Semestr 2/algebra/lista10/68.png Binary files differnew file mode 100644 index 0000000..9e036f5 --- /dev/null +++ b/Semestr 2/algebra/lista10/68.png diff --git a/Semestr 2/algebra/lista10/69.png b/Semestr 2/algebra/lista10/69.png Binary files differnew file mode 100644 index 0000000..1c15346 --- /dev/null +++ b/Semestr 2/algebra/lista10/69.png diff --git a/Semestr 2/algebra/lista10/70.png b/Semestr 2/algebra/lista10/70.png Binary files differnew file mode 100644 index 0000000..9665a37 --- /dev/null +++ b/Semestr 2/algebra/lista10/70.png diff --git a/Semestr 2/algebra/lista10/71.png b/Semestr 2/algebra/lista10/71.png Binary files differnew file mode 100644 index 0000000..b8874b1 --- /dev/null +++ b/Semestr 2/algebra/lista10/71.png diff --git a/Semestr 2/algebra/lista10/72.png b/Semestr 2/algebra/lista10/72.png Binary files differnew file mode 100644 index 0000000..756231b --- /dev/null +++ b/Semestr 2/algebra/lista10/72.png diff --git a/Semestr 2/algebra/lista10/73.png b/Semestr 2/algebra/lista10/73.png Binary files differnew file mode 100644 index 0000000..27805e2 --- /dev/null +++ b/Semestr 2/algebra/lista10/73.png diff --git a/Semestr 2/algebra/lista10/74.png b/Semestr 2/algebra/lista10/74.png Binary files differnew file mode 100644 index 0000000..a441e21 --- /dev/null +++ b/Semestr 2/algebra/lista10/74.png diff --git a/Semestr 2/algebra/lista10/75.png b/Semestr 2/algebra/lista10/75.png Binary files differnew file mode 100644 index 0000000..16dedc1 --- /dev/null +++ b/Semestr 2/algebra/lista10/75.png diff --git a/Semestr 2/algebra/lista10/76.png b/Semestr 2/algebra/lista10/76.png Binary files differnew file mode 100644 index 0000000..7671d0c --- /dev/null +++ b/Semestr 2/algebra/lista10/76.png diff --git a/Semestr 2/algebra/lista10/77.png b/Semestr 2/algebra/lista10/77.png Binary files differnew file mode 100644 index 0000000..ecd5099 --- /dev/null +++ b/Semestr 2/algebra/lista10/77.png diff --git a/Semestr 2/algebra/lista10/zad1.jpg b/Semestr 2/algebra/lista10/zad1.jpg Binary files differnew file mode 100644 index 0000000..43206e2 --- /dev/null +++ b/Semestr 2/algebra/lista10/zad1.jpg diff --git a/Semestr 2/algebra/lista10/zad11.jpg b/Semestr 2/algebra/lista10/zad11.jpg Binary files differnew file mode 100644 index 0000000..1f6852c --- /dev/null +++ b/Semestr 2/algebra/lista10/zad11.jpg diff --git a/Semestr 2/algebra/lista10/zad21A.jpg b/Semestr 2/algebra/lista10/zad21A.jpg Binary files differnew file mode 100644 index 0000000..2e113b2 --- /dev/null +++ b/Semestr 2/algebra/lista10/zad21A.jpg diff --git a/Semestr 2/algebra/lista10/zad21B.jpg b/Semestr 2/algebra/lista10/zad21B.jpg Binary files differnew file mode 100644 index 0000000..c457411 --- /dev/null +++ b/Semestr 2/algebra/lista10/zad21B.jpg diff --git a/Semestr 2/algebra/lista10/zad21C.jpg b/Semestr 2/algebra/lista10/zad21C.jpg Binary files differnew file mode 100644 index 0000000..d6a2eb8 --- /dev/null +++ b/Semestr 2/algebra/lista10/zad21C.jpg diff --git a/Semestr 2/algebra/lista10/zad21D.jpg b/Semestr 2/algebra/lista10/zad21D.jpg Binary files differnew file mode 100644 index 0000000..2406f53 --- /dev/null +++ b/Semestr 2/algebra/lista10/zad21D.jpg diff --git a/Semestr 2/algebra/lista10/zad3.jpg b/Semestr 2/algebra/lista10/zad3.jpg Binary files differnew file mode 100644 index 0000000..7c99c84 --- /dev/null +++ b/Semestr 2/algebra/lista10/zad3.jpg diff --git a/Semestr 2/algebra/lista10/zad6.jpg b/Semestr 2/algebra/lista10/zad6.jpg Binary files differnew file mode 100644 index 0000000..e75f2e2 --- /dev/null +++ b/Semestr 2/algebra/lista10/zad6.jpg diff --git a/Semestr 2/algebra/lista10/zad7.jpg b/Semestr 2/algebra/lista10/zad7.jpg Binary files differnew file mode 100644 index 0000000..669ccc7 --- /dev/null +++ b/Semestr 2/algebra/lista10/zad7.jpg diff --git a/Semestr 2/algebra/lista11/78.png b/Semestr 2/algebra/lista11/78.png Binary files differnew file mode 100644 index 0000000..db20401 --- /dev/null +++ b/Semestr 2/algebra/lista11/78.png diff --git a/Semestr 2/algebra/lista11/79.png b/Semestr 2/algebra/lista11/79.png Binary files differnew file mode 100644 index 0000000..21908b8 --- /dev/null +++ b/Semestr 2/algebra/lista11/79.png diff --git a/Semestr 2/algebra/lista11/80.png b/Semestr 2/algebra/lista11/80.png Binary files differnew file mode 100644 index 0000000..b2a153f --- /dev/null +++ b/Semestr 2/algebra/lista11/80.png diff --git a/Semestr 2/algebra/lista11/81.png b/Semestr 2/algebra/lista11/81.png Binary files differnew file mode 100644 index 0000000..3d65485 --- /dev/null +++ b/Semestr 2/algebra/lista11/81.png diff --git a/Semestr 2/algebra/lista11/82.png b/Semestr 2/algebra/lista11/82.png Binary files differnew file mode 100644 index 0000000..d90b5b9 --- /dev/null +++ b/Semestr 2/algebra/lista11/82.png diff --git a/Semestr 2/algebra/lista11/83.png b/Semestr 2/algebra/lista11/83.png Binary files differnew file mode 100644 index 0000000..915574b --- /dev/null +++ b/Semestr 2/algebra/lista11/83.png diff --git a/Semestr 2/algebra/lista11/84.png b/Semestr 2/algebra/lista11/84.png Binary files differnew file mode 100644 index 0000000..d2dda41 --- /dev/null +++ b/Semestr 2/algebra/lista11/84.png diff --git a/Semestr 2/algebra/lista11/85.png b/Semestr 2/algebra/lista11/85.png Binary files differnew file mode 100644 index 0000000..00216c8 --- /dev/null +++ b/Semestr 2/algebra/lista11/85.png diff --git a/Semestr 2/algebra/lista11/86.png b/Semestr 2/algebra/lista11/86.png Binary files differnew file mode 100644 index 0000000..8f649e3 --- /dev/null +++ b/Semestr 2/algebra/lista11/86.png diff --git a/Semestr 2/algebra/lista11/87.png b/Semestr 2/algebra/lista11/87.png Binary files differnew file mode 100644 index 0000000..037ebc4 --- /dev/null +++ b/Semestr 2/algebra/lista11/87.png diff --git a/Semestr 2/algebra/lista11/88.png b/Semestr 2/algebra/lista11/88.png Binary files differnew file mode 100644 index 0000000..94a43c9 --- /dev/null +++ b/Semestr 2/algebra/lista11/88.png diff --git a/Semestr 2/algebra/lista11/89.png b/Semestr 2/algebra/lista11/89.png Binary files differnew file mode 100644 index 0000000..fa58ac9 --- /dev/null +++ b/Semestr 2/algebra/lista11/89.png diff --git a/Semestr 2/algebra/lista11/90.png b/Semestr 2/algebra/lista11/90.png Binary files differnew file mode 100644 index 0000000..de92a0a --- /dev/null +++ b/Semestr 2/algebra/lista11/90.png diff --git a/Semestr 2/algebra/lista11/91.png b/Semestr 2/algebra/lista11/91.png Binary files differnew file mode 100644 index 0000000..47aff85 --- /dev/null +++ b/Semestr 2/algebra/lista11/91.png diff --git a/Semestr 2/algebra/lista11/92.png b/Semestr 2/algebra/lista11/92.png Binary files differnew file mode 100644 index 0000000..42d9caf --- /dev/null +++ b/Semestr 2/algebra/lista11/92.png diff --git a/Semestr 2/algebra/lista11/zad1312.jpg b/Semestr 2/algebra/lista11/zad1312.jpg Binary files differnew file mode 100644 index 0000000..63674a3 --- /dev/null +++ b/Semestr 2/algebra/lista11/zad1312.jpg diff --git a/Semestr 2/algebra/lista11/zad2.jpg b/Semestr 2/algebra/lista11/zad2.jpg Binary files differnew file mode 100644 index 0000000..9793c78 --- /dev/null +++ b/Semestr 2/algebra/lista11/zad2.jpg diff --git a/Semestr 2/algebra/lista11/zad2c.jpg b/Semestr 2/algebra/lista11/zad2c.jpg Binary files differnew file mode 100644 index 0000000..de85e61 --- /dev/null +++ b/Semestr 2/algebra/lista11/zad2c.jpg diff --git a/Semestr 2/algebra/lista11/zad6.jpg b/Semestr 2/algebra/lista11/zad6.jpg Binary files differnew file mode 100644 index 0000000..582bddc --- /dev/null +++ b/Semestr 2/algebra/lista11/zad6.jpg diff --git a/Semestr 2/algebra/lista11/zad7a.jpg b/Semestr 2/algebra/lista11/zad7a.jpg Binary files differnew file mode 100644 index 0000000..944b735 --- /dev/null +++ b/Semestr 2/algebra/lista11/zad7a.jpg diff --git a/Semestr 2/algebra/lista11/zad7b.jpg b/Semestr 2/algebra/lista11/zad7b.jpg Binary files differnew file mode 100644 index 0000000..1e62ad2 --- /dev/null +++ b/Semestr 2/algebra/lista11/zad7b.jpg diff --git a/Semestr 2/algebra/lista11/zad9.jpg b/Semestr 2/algebra/lista11/zad9.jpg Binary files differnew file mode 100644 index 0000000..cb0646e --- /dev/null +++ b/Semestr 2/algebra/lista11/zad9.jpg diff --git a/Semestr 2/algebra/lista12/100.png b/Semestr 2/algebra/lista12/100.png Binary files differnew file mode 100644 index 0000000..32b2012 --- /dev/null +++ b/Semestr 2/algebra/lista12/100.png diff --git a/Semestr 2/algebra/lista12/101.png b/Semestr 2/algebra/lista12/101.png Binary files differnew file mode 100644 index 0000000..4eee8ba --- /dev/null +++ b/Semestr 2/algebra/lista12/101.png diff --git a/Semestr 2/algebra/lista12/102.png b/Semestr 2/algebra/lista12/102.png Binary files differnew file mode 100644 index 0000000..6c2c8b4 --- /dev/null +++ b/Semestr 2/algebra/lista12/102.png diff --git a/Semestr 2/algebra/lista12/103.png b/Semestr 2/algebra/lista12/103.png Binary files differnew file mode 100644 index 0000000..d417206 --- /dev/null +++ b/Semestr 2/algebra/lista12/103.png diff --git a/Semestr 2/algebra/lista12/104.png b/Semestr 2/algebra/lista12/104.png Binary files differnew file mode 100644 index 0000000..3a1522d --- /dev/null +++ b/Semestr 2/algebra/lista12/104.png diff --git a/Semestr 2/algebra/lista12/105.png b/Semestr 2/algebra/lista12/105.png Binary files differnew file mode 100644 index 0000000..583e7d6 --- /dev/null +++ b/Semestr 2/algebra/lista12/105.png diff --git a/Semestr 2/algebra/lista12/107.png b/Semestr 2/algebra/lista12/107.png Binary files differnew file mode 100644 index 0000000..9f715e4 --- /dev/null +++ b/Semestr 2/algebra/lista12/107.png diff --git a/Semestr 2/algebra/lista12/16.jpg b/Semestr 2/algebra/lista12/16.jpg Binary files differnew file mode 100644 index 0000000..3e7c20c --- /dev/null +++ b/Semestr 2/algebra/lista12/16.jpg diff --git a/Semestr 2/algebra/lista12/21.jpg b/Semestr 2/algebra/lista12/21.jpg Binary files differnew file mode 100644 index 0000000..263e8d4 --- /dev/null +++ b/Semestr 2/algebra/lista12/21.jpg diff --git a/Semestr 2/algebra/lista12/7a.jpg b/Semestr 2/algebra/lista12/7a.jpg Binary files differnew file mode 100644 index 0000000..e84ef5e --- /dev/null +++ b/Semestr 2/algebra/lista12/7a.jpg diff --git a/Semestr 2/algebra/lista12/7b.jpg b/Semestr 2/algebra/lista12/7b.jpg Binary files differnew file mode 100644 index 0000000..061543b --- /dev/null +++ b/Semestr 2/algebra/lista12/7b.jpg diff --git a/Semestr 2/algebra/lista12/8.jpg b/Semestr 2/algebra/lista12/8.jpg Binary files differnew file mode 100644 index 0000000..94f8206 --- /dev/null +++ b/Semestr 2/algebra/lista12/8.jpg diff --git a/Semestr 2/algebra/lista12/9.jpg b/Semestr 2/algebra/lista12/9.jpg Binary files differnew file mode 100644 index 0000000..a26d268 --- /dev/null +++ b/Semestr 2/algebra/lista12/9.jpg diff --git a/Semestr 2/algebra/lista12/95.png b/Semestr 2/algebra/lista12/95.png Binary files differnew file mode 100644 index 0000000..07493f5 --- /dev/null +++ b/Semestr 2/algebra/lista12/95.png diff --git a/Semestr 2/algebra/lista12/96.png b/Semestr 2/algebra/lista12/96.png Binary files differnew file mode 100644 index 0000000..bb1c592 --- /dev/null +++ b/Semestr 2/algebra/lista12/96.png diff --git a/Semestr 2/algebra/lista12/97.png b/Semestr 2/algebra/lista12/97.png Binary files differnew file mode 100644 index 0000000..2bf4bee --- /dev/null +++ b/Semestr 2/algebra/lista12/97.png diff --git a/Semestr 2/algebra/lista12/98.png b/Semestr 2/algebra/lista12/98.png Binary files differnew file mode 100644 index 0000000..413f7a6 --- /dev/null +++ b/Semestr 2/algebra/lista12/98.png diff --git a/Semestr 2/algebra/lista12/99.png b/Semestr 2/algebra/lista12/99.png Binary files differnew file mode 100644 index 0000000..32f8997 --- /dev/null +++ b/Semestr 2/algebra/lista12/99.png diff --git a/Semestr 2/algebra/lista12/unknown.png b/Semestr 2/algebra/lista12/unknown.png Binary files differnew file mode 100644 index 0000000..5556264 --- /dev/null +++ b/Semestr 2/algebra/lista12/unknown.png diff --git a/Semestr 2/algebra/lista12/zad5.jpg b/Semestr 2/algebra/lista12/zad5.jpg Binary files differnew file mode 100644 index 0000000..fabc22b --- /dev/null +++ b/Semestr 2/algebra/lista12/zad5.jpg diff --git a/Semestr 2/algebra/lista13/110.png b/Semestr 2/algebra/lista13/110.png Binary files differnew file mode 100644 index 0000000..2ac2e37 --- /dev/null +++ b/Semestr 2/algebra/lista13/110.png diff --git a/Semestr 2/algebra/lista13/111.png b/Semestr 2/algebra/lista13/111.png Binary files differnew file mode 100644 index 0000000..6c4fc2d --- /dev/null +++ b/Semestr 2/algebra/lista13/111.png diff --git a/Semestr 2/algebra/lista13/112.png b/Semestr 2/algebra/lista13/112.png Binary files differnew file mode 100644 index 0000000..432aec0 --- /dev/null +++ b/Semestr 2/algebra/lista13/112.png diff --git a/Semestr 2/algebra/lista13/113.png b/Semestr 2/algebra/lista13/113.png Binary files differnew file mode 100644 index 0000000..dad0858 --- /dev/null +++ b/Semestr 2/algebra/lista13/113.png diff --git a/Semestr 2/algebra/lista13/114.png b/Semestr 2/algebra/lista13/114.png Binary files differnew file mode 100644 index 0000000..ba0a7cb --- /dev/null +++ b/Semestr 2/algebra/lista13/114.png diff --git a/Semestr 2/algebra/lista13/115.png b/Semestr 2/algebra/lista13/115.png Binary files differnew file mode 100644 index 0000000..07d838f --- /dev/null +++ b/Semestr 2/algebra/lista13/115.png diff --git a/Semestr 2/algebra/lista13/116.png b/Semestr 2/algebra/lista13/116.png Binary files differnew file mode 100644 index 0000000..5e19116 --- /dev/null +++ b/Semestr 2/algebra/lista13/116.png diff --git a/Semestr 2/algebra/lista13/117.png b/Semestr 2/algebra/lista13/117.png Binary files differnew file mode 100644 index 0000000..faa3b2c --- /dev/null +++ b/Semestr 2/algebra/lista13/117.png diff --git a/Semestr 2/algebra/lista13/118.png b/Semestr 2/algebra/lista13/118.png Binary files differnew file mode 100644 index 0000000..572840d --- /dev/null +++ b/Semestr 2/algebra/lista13/118.png diff --git a/Semestr 2/algebra/lista13/zad11.jpg b/Semestr 2/algebra/lista13/zad11.jpg Binary files differnew file mode 100644 index 0000000..890377d --- /dev/null +++ b/Semestr 2/algebra/lista13/zad11.jpg diff --git a/Semestr 2/algebra/lista13/zad7.jpg b/Semestr 2/algebra/lista13/zad7.jpg Binary files differnew file mode 100644 index 0000000..5ec8064 --- /dev/null +++ b/Semestr 2/algebra/lista13/zad7.jpg diff --git a/Semestr 2/algebra/lista13/zad8a.jpg b/Semestr 2/algebra/lista13/zad8a.jpg Binary files differnew file mode 100644 index 0000000..c631e11 --- /dev/null +++ b/Semestr 2/algebra/lista13/zad8a.jpg diff --git a/Semestr 2/algebra/lista13/zad8b.jpg b/Semestr 2/algebra/lista13/zad8b.jpg Binary files differnew file mode 100644 index 0000000..d35585b --- /dev/null +++ b/Semestr 2/algebra/lista13/zad8b.jpg diff --git a/Semestr 2/algebra/lista14/11.jpg b/Semestr 2/algebra/lista14/11.jpg Binary files differnew file mode 100644 index 0000000..9197141 --- /dev/null +++ b/Semestr 2/algebra/lista14/11.jpg diff --git a/Semestr 2/algebra/lista14/1a.jpg b/Semestr 2/algebra/lista14/1a.jpg Binary files differnew file mode 100644 index 0000000..3f25d1c --- /dev/null +++ b/Semestr 2/algebra/lista14/1a.jpg diff --git a/Semestr 2/algebra/lista14/1aa.jpg b/Semestr 2/algebra/lista14/1aa.jpg Binary files differnew file mode 100644 index 0000000..dd22bde --- /dev/null +++ b/Semestr 2/algebra/lista14/1aa.jpg diff --git a/Semestr 2/algebra/lista14/1c.jpg b/Semestr 2/algebra/lista14/1c.jpg Binary files differnew file mode 100644 index 0000000..9181ea2 --- /dev/null +++ b/Semestr 2/algebra/lista14/1c.jpg diff --git a/Semestr 2/algebra/lista14/1cc.jpg b/Semestr 2/algebra/lista14/1cc.jpg Binary files differnew file mode 100644 index 0000000..c258f16 --- /dev/null +++ b/Semestr 2/algebra/lista14/1cc.jpg diff --git a/Semestr 2/algebra/lista14/7.jpg b/Semestr 2/algebra/lista14/7.jpg Binary files differnew file mode 100644 index 0000000..cee2b83 --- /dev/null +++ b/Semestr 2/algebra/lista14/7.jpg diff --git a/Semestr 2/algebra/lista14/8.jpg b/Semestr 2/algebra/lista14/8.jpg Binary files differnew file mode 100644 index 0000000..877a488 --- /dev/null +++ b/Semestr 2/algebra/lista14/8.jpg diff --git a/Semestr 2/algebra/lista14/9a.jpg b/Semestr 2/algebra/lista14/9a.jpg Binary files differnew file mode 100644 index 0000000..51fc8fc --- /dev/null +++ b/Semestr 2/algebra/lista14/9a.jpg diff --git a/Semestr 2/algebra/lista14/9b.jpg b/Semestr 2/algebra/lista14/9b.jpg Binary files differnew file mode 100644 index 0000000..14345c8 --- /dev/null +++ b/Semestr 2/algebra/lista14/9b.jpg diff --git a/Semestr 2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdf b/Semestr 2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdf Binary files differnew file mode 100644 index 0000000..bac9a67 --- /dev/null +++ b/Semestr 2/algebra/lista14/FraMal,z1;7;8;9;11;18.pdf diff --git a/Semestr 2/algebra/lista14/zad18.jpg b/Semestr 2/algebra/lista14/zad18.jpg Binary files differnew file mode 100644 index 0000000..d7cb461 --- /dev/null +++ b/Semestr 2/algebra/lista14/zad18.jpg diff --git a/Semestr 2/algebra/lista9/32.jpg b/Semestr 2/algebra/lista9/32.jpg Binary files differnew file mode 100644 index 0000000..66d37a7 --- /dev/null +++ b/Semestr 2/algebra/lista9/32.jpg diff --git a/Semestr 2/algebra/lista9/34.jpg b/Semestr 2/algebra/lista9/34.jpg Binary files differnew file mode 100644 index 0000000..14d8458 --- /dev/null +++ b/Semestr 2/algebra/lista9/34.jpg diff --git a/Semestr 2/algebra/lista9/36.jpg b/Semestr 2/algebra/lista9/36.jpg Binary files differnew file mode 100644 index 0000000..44cb097 --- /dev/null +++ b/Semestr 2/algebra/lista9/36.jpg diff --git a/Semestr 2/algebra/lista9/38.jpg b/Semestr 2/algebra/lista9/38.jpg Binary files differnew file mode 100644 index 0000000..2ad8395 --- /dev/null +++ b/Semestr 2/algebra/lista9/38.jpg diff --git a/Semestr 2/algebra/lista9/40.jpg b/Semestr 2/algebra/lista9/40.jpg Binary files differnew file mode 100644 index 0000000..dbb145c --- /dev/null +++ b/Semestr 2/algebra/lista9/40.jpg diff --git a/Semestr 2/algebra/lista9/42.jpg b/Semestr 2/algebra/lista9/42.jpg Binary files differnew file mode 100644 index 0000000..36bcae9 --- /dev/null +++ b/Semestr 2/algebra/lista9/42.jpg diff --git a/Semestr 2/algebra/lista9/44.jpg b/Semestr 2/algebra/lista9/44.jpg Binary files differnew file mode 100644 index 0000000..fcf96e2 --- /dev/null +++ b/Semestr 2/algebra/lista9/44.jpg diff --git a/Semestr 2/algebra/lista9/46.jpg b/Semestr 2/algebra/lista9/46.jpg Binary files differnew file mode 100644 index 0000000..f04c4ed --- /dev/null +++ b/Semestr 2/algebra/lista9/46.jpg diff --git a/Semestr 2/algebra/lista9/48.jpg b/Semestr 2/algebra/lista9/48.jpg Binary files differnew file mode 100644 index 0000000..988cf50 --- /dev/null +++ b/Semestr 2/algebra/lista9/48.jpg diff --git a/Semestr 2/algebra/lista9/50.jpg b/Semestr 2/algebra/lista9/50.jpg Binary files differnew file mode 100644 index 0000000..d4afb6d --- /dev/null +++ b/Semestr 2/algebra/lista9/50.jpg diff --git a/Semestr 2/algebra/lista9/zad10.jpg b/Semestr 2/algebra/lista9/zad10.jpg Binary files differnew file mode 100644 index 0000000..6c7137a --- /dev/null +++ b/Semestr 2/algebra/lista9/zad10.jpg diff --git a/Semestr 2/algebra/lista9/zad10bpoprawka.jpg b/Semestr 2/algebra/lista9/zad10bpoprawka.jpg Binary files differnew file mode 100644 index 0000000..73f79c2 --- /dev/null +++ b/Semestr 2/algebra/lista9/zad10bpoprawka.jpg diff --git a/Semestr 2/algebra/lista9/zad11.jpg b/Semestr 2/algebra/lista9/zad11.jpg Binary files differnew file mode 100644 index 0000000..2fb3cb1 --- /dev/null +++ b/Semestr 2/algebra/lista9/zad11.jpg diff --git a/Semestr 2/algebra/lista9/zad12.jpg b/Semestr 2/algebra/lista9/zad12.jpg Binary files differnew file mode 100644 index 0000000..152c3a4 --- /dev/null +++ b/Semestr 2/algebra/lista9/zad12.jpg diff --git a/Semestr 2/algebra/lista9/zad13.jpg b/Semestr 2/algebra/lista9/zad13.jpg Binary files differnew file mode 100644 index 0000000..6404ef0 --- /dev/null +++ b/Semestr 2/algebra/lista9/zad13.jpg diff --git a/Semestr 2/algebra/lista9/zad6.jpg b/Semestr 2/algebra/lista9/zad6.jpg Binary files differnew file mode 100644 index 0000000..e392b4b --- /dev/null +++ b/Semestr 2/algebra/lista9/zad6.jpg diff --git a/Semestr 2/algebra/lista9/zad8a.jpg b/Semestr 2/algebra/lista9/zad8a.jpg Binary files differnew file mode 100644 index 0000000..37a64a5 --- /dev/null +++ b/Semestr 2/algebra/lista9/zad8a.jpg diff --git a/Semestr 2/algebra/lista9/zad8b.jpg b/Semestr 2/algebra/lista9/zad8b.jpg Binary files differnew file mode 100644 index 0000000..1864fe6 --- /dev/null +++ b/Semestr 2/algebra/lista9/zad8b.jpg diff --git a/Semestr 2/algebra/lista9/zad9.jpg b/Semestr 2/algebra/lista9/zad9.jpg Binary files differnew file mode 100644 index 0000000..bababf7 --- /dev/null +++ b/Semestr 2/algebra/lista9/zad9.jpg diff --git a/Semestr 2/algebra/z1a-skonwertowany.pdf b/Semestr 2/algebra/z1a-skonwertowany.pdf Binary files differnew file mode 100644 index 0000000..a4d4941 --- /dev/null +++ b/Semestr 2/algebra/z1a-skonwertowany.pdf diff --git a/Semestr 2/algebra/zad101213.jpg b/Semestr 2/algebra/zad101213.jpg Binary files differnew file mode 100644 index 0000000..e3bf7e2 --- /dev/null +++ b/Semestr 2/algebra/zad101213.jpg diff --git a/Semestr 2/algebra/zad14.jpg b/Semestr 2/algebra/zad14.jpg Binary files differnew file mode 100644 index 0000000..95a8c95 --- /dev/null +++ b/Semestr 2/algebra/zad14.jpg diff --git a/Semestr 2/algebra/zad2;3;6;7;11;21.pdf b/Semestr 2/algebra/zad2;3;6;7;11;21.pdf Binary files differnew file mode 100644 index 0000000..6eb52f7 --- /dev/null +++ b/Semestr 2/algebra/zad2;3;6;7;11;21.pdf diff --git a/Semestr 2/algebra/zad2;6;7;9.pdf b/Semestr 2/algebra/zad2;6;7;9.pdf Binary files differnew file mode 100644 index 0000000..1a64f57 --- /dev/null +++ b/Semestr 2/algebra/zad2;6;7;9.pdf diff --git a/Semestr 2/algebra/zad5;7;8;9;16.pdf b/Semestr 2/algebra/zad5;7;8;9;16.pdf Binary files differnew file mode 100644 index 0000000..c20a41e --- /dev/null +++ b/Semestr 2/algebra/zad5;7;8;9;16.pdf diff --git a/Semestr 2/algebra/zad7;8;11;15.pdf b/Semestr 2/algebra/zad7;8;11;15.pdf Binary files differnew file mode 100644 index 0000000..2b1e160 --- /dev/null +++ b/Semestr 2/algebra/zad7;8;11;15.pdf diff --git a/Semestr 2/analiza/Analiza_last_gwiazdka.pdf b/Semestr 2/analiza/Analiza_last_gwiazdka.pdf Binary files differnew file mode 100644 index 0000000..72d3041 --- /dev/null +++ b/Semestr 2/analiza/Analiza_last_gwiazdka.pdf diff --git a/Semestr 2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTKÓW 18.pdf b/Semestr 2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTKÓW 18.pdf Binary files differnew file mode 100644 index 0000000..99b3e17 --- /dev/null +++ b/Semestr 2/analiza/L11Z8,9;L12Z1,2,3,7; PUNTKÓW 18.pdf diff --git a/Semestr 2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf b/Semestr 2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf Binary files differnew file mode 100644 index 0000000..b3814dc --- /dev/null +++ b/Semestr 2/analiza/L3Z11;Szwarc26.03;Obie gwiazdki.pdf diff --git a/Semestr 2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punktów 34.pdf b/Semestr 2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punktów 34.pdf Binary files differnew file mode 100644 index 0000000..7c37d85 --- /dev/null +++ b/Semestr 2/analiza/L9Z7;L10Z2,3,4;L11Z1,2,4,5,6;Punktów 34.pdf diff --git a/Semestr 2/analiza/Lista7;21pkt.pdf b/Semestr 2/analiza/Lista7;21pkt.pdf Binary files differnew file mode 100644 index 0000000..e7328d9 --- /dev/null +++ b/Semestr 2/analiza/Lista7;21pkt.pdf diff --git a/Semestr 2/analiza/Lista9;zad3;5;6;8;12;PUNKTÓW 25.pdf b/Semestr 2/analiza/Lista9;zad3;5;6;8;12;PUNKTÓW 25.pdf Binary files differnew file mode 100644 index 0000000..82894fd --- /dev/null +++ b/Semestr 2/analiza/Lista9;zad3;5;6;8;12;PUNKTÓW 25.pdf diff --git a/Semestr 2/analiza/lista11/LISTA3;zad11.jpg b/Semestr 2/analiza/lista11/LISTA3;zad11.jpg Binary files differnew file mode 100644 index 0000000..19c129d --- /dev/null +++ b/Semestr 2/analiza/lista11/LISTA3;zad11.jpg diff --git a/Semestr 2/analiza/lista11/l11z8l12z1.jpg b/Semestr 2/analiza/lista11/l11z8l12z1.jpg Binary files differnew file mode 100644 index 0000000..2766310 --- /dev/null +++ b/Semestr 2/analiza/lista11/l11z8l12z1.jpg diff --git a/Semestr 2/analiza/lista11/l11z9.jpg b/Semestr 2/analiza/lista11/l11z9.jpg Binary files differnew file mode 100644 index 0000000..b38f822 --- /dev/null +++ b/Semestr 2/analiza/lista11/l11z9.jpg diff --git a/Semestr 2/analiza/lista11/l12z2.jpg b/Semestr 2/analiza/lista11/l12z2.jpg Binary files differnew file mode 100644 index 0000000..835dd21 --- /dev/null +++ b/Semestr 2/analiza/lista11/l12z2.jpg diff --git a/Semestr 2/analiza/lista11/l12z3.jpg b/Semestr 2/analiza/lista11/l12z3.jpg Binary files differnew file mode 100644 index 0000000..38e4ac8 --- /dev/null +++ b/Semestr 2/analiza/lista11/l12z3.jpg diff --git a/Semestr 2/analiza/lista11/l12z7.jpg b/Semestr 2/analiza/lista11/l12z7.jpg Binary files differnew file mode 100644 index 0000000..396f123 --- /dev/null +++ b/Semestr 2/analiza/lista11/l12z7.jpg diff --git a/Semestr 2/analiza/lista11/szwarc26.06.jpg b/Semestr 2/analiza/lista11/szwarc26.06.jpg Binary files differnew file mode 100644 index 0000000..6d6cb60 --- /dev/null +++ b/Semestr 2/analiza/lista11/szwarc26.06.jpg diff --git a/Semestr 2/analiza/lista11/zad11b.jpg b/Semestr 2/analiza/lista11/zad11b.jpg Binary files differnew file mode 100644 index 0000000..68ad10b --- /dev/null +++ b/Semestr 2/analiza/lista11/zad11b.jpg diff --git a/Semestr 2/analiza/lista11/zad1a-e.jpg b/Semestr 2/analiza/lista11/zad1a-e.jpg Binary files differnew file mode 100644 index 0000000..e1eb2f5 --- /dev/null +++ b/Semestr 2/analiza/lista11/zad1a-e.jpg diff --git a/Semestr 2/analiza/lista11/zad1f2.jpg b/Semestr 2/analiza/lista11/zad1f2.jpg Binary files differnew file mode 100644 index 0000000..30395f2 --- /dev/null +++ b/Semestr 2/analiza/lista11/zad1f2.jpg diff --git a/Semestr 2/analiza/lista11/zad2.jpg b/Semestr 2/analiza/lista11/zad2.jpg Binary files differnew file mode 100644 index 0000000..60183a4 --- /dev/null +++ b/Semestr 2/analiza/lista11/zad2.jpg diff --git a/Semestr 2/analiza/lista11/zad3.jpg b/Semestr 2/analiza/lista11/zad3.jpg Binary files differnew file mode 100644 index 0000000..9be3db6 --- /dev/null +++ b/Semestr 2/analiza/lista11/zad3.jpg diff --git a/Semestr 2/analiza/lista11/zad4.jpg b/Semestr 2/analiza/lista11/zad4.jpg Binary files differnew file mode 100644 index 0000000..2535e05 --- /dev/null +++ b/Semestr 2/analiza/lista11/zad4.jpg diff --git a/Semestr 2/analiza/lista11/zad465.jpg b/Semestr 2/analiza/lista11/zad465.jpg Binary files differnew file mode 100644 index 0000000..fcfdda3 --- /dev/null +++ b/Semestr 2/analiza/lista11/zad465.jpg diff --git a/Semestr 2/analiza/lista11/zad7a.jpg b/Semestr 2/analiza/lista11/zad7a.jpg Binary files differnew file mode 100644 index 0000000..5c045d9 --- /dev/null +++ b/Semestr 2/analiza/lista11/zad7a.jpg diff --git a/Semestr 2/analiza/lista11/zad7b.jpg b/Semestr 2/analiza/lista11/zad7b.jpg Binary files differnew file mode 100644 index 0000000..5308651 --- /dev/null +++ b/Semestr 2/analiza/lista11/zad7b.jpg diff --git a/Semestr 2/analiza/zad12.jpg b/Semestr 2/analiza/zad12.jpg Binary files differnew file mode 100644 index 0000000..4da6d95 --- /dev/null +++ b/Semestr 2/analiza/zad12.jpg diff --git a/Semestr 2/analiza/zad3;5.jpg b/Semestr 2/analiza/zad3;5.jpg Binary files differnew file mode 100644 index 0000000..bacf11a --- /dev/null +++ b/Semestr 2/analiza/zad3;5.jpg diff --git a/Semestr 2/analiza/zad6;8a.jpg b/Semestr 2/analiza/zad6;8a.jpg Binary files differnew file mode 100644 index 0000000..eec9653 --- /dev/null +++ b/Semestr 2/analiza/zad6;8a.jpg diff --git a/Semestr 2/analiza/zad8b1.jpg b/Semestr 2/analiza/zad8b1.jpg Binary files differnew file mode 100644 index 0000000..e16c886 --- /dev/null +++ b/Semestr 2/analiza/zad8b1.jpg diff --git a/Semestr 2/analiza/zad8b2.jpg b/Semestr 2/analiza/zad8b2.jpg Binary files differnew file mode 100644 index 0000000..224a6e6 --- /dev/null +++ b/Semestr 2/analiza/zad8b2.jpg diff --git a/Semestr 2/analiza/zad8c.jpg b/Semestr 2/analiza/zad8c.jpg Binary files differnew file mode 100644 index 0000000..91b1be1 --- /dev/null +++ b/Semestr 2/analiza/zad8c.jpg diff --git a/Semestr 2/racket/cnf.rkt b/Semestr 2/racket/cnf.rkt new file mode 100644 index 0000000..67bd70f --- /dev/null +++ b/Semestr 2/racket/cnf.rkt @@ -0,0 +1,188 @@ +#lang racket + +(define (var? t) (symbol? t)) + +(define (neg? t) + (and (list? t) + (= 2 (length t)) + (eq? 'neg (car t)))) + +(define (conj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'conj (car t)))) + +(define (disj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'disj (car t)))) + +(define (lit? t) + (or (var? t) + (and (neg? t) + (var? (neg-subf t))))) + +(define (prop? f) + (or (var? f) + (and (neg? f) + (prop? (neg-subf f))) + (and (disj? f) + (prop? (disj-left f)) + (prop? (disj-right f))) + (and (conj? f) + (prop? (conj-left f)) + (prop? (conj-right f))))) + +(define (make-conj left right) + (list 'conj left right)) + +(define (make-disj left right) + (list 'disj left right)) + +(define (make-neg f) + (list 'neg f)) + +(define (conj-left f) + (if (conj? f) + (cadr f) + (error "Złe dane ze znacznikiem -- CONJ-LEFT" f))) + +(define (conj-right f) + (if (conj? f) + (caddr f) + (error "Złe dane ze znacznikiem -- CONJ-RIGHT" f))) + +(define (disj-left f) + (if (disj? f) + (cadr f) + (error "Złe dane ze znacznikiem -- DISJ-LEFT" f))) + +(define (disj-right f) + (if (disj? f) + (caddr f) + (error "Złe dane ze znacznikiem -- DISJ-RIGHT" f))) + +(define (neg-subf f) + (if (neg? f) + (cadr f) + (error "Złe dane ze znacznikiem -- NEG-FORM" f))) + +(define (lit-var f) + (cond [(var? f) f] + [(neg? f) (neg-subf f)] + [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)])) + +(define (free-vars f) + (cond [(null? f) null] + [(var? f) (list f)] + [(neg? f) (free-vars (neg-subf f))] + [(conj? f) (append (free-vars (conj-left f)) + (free-vars (conj-right f)))] + [(disj? f) (append (free-vars (disj-left f)) + (free-vars (disj-right f)))] + [else (error "Zła formula -- FREE-VARS" f)])) + +(define (gen-vals xs) + (if (null? xs) + (list null) + (let* + ((vss (gen-vals (cdr xs))) + (x (car xs)) + (vst (map (λ (vs) (cons (list x true) vs)) vss)) + (vsf (map (λ (vs) (cons (list x false) vs)) vss))) + (append vst vsf)))) + +(define (eval-formula f evaluation) + (cond [(var? f) + (let ((val (assoc f evaluation))) + (if (not val) + (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation) + (cadr val)))] + [(neg? f) (not (eval-formula (neg-subf f) evaluation))] + [(disj? f) (or (eval-formula (disj-left f) evaluation) + (eval-formula (disj-right f) evaluation))] + [(conj? f) (and (eval-formula (conj-left f) evaluation) + (eval-formula (conj-right f) evaluation))] + [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)])) + +(define (falsifable-eval? f) + (let* ((evaluations (gen-vals (free-vars f))) + (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations))) + (ormap false? results))) + +(define (nff? f) + (cond [(lit? f) true] + [(neg? f) false] + [(conj? f) (and (nff? (conj-left f)) + (nff? (conj-right f)))] + [(disj? f) (and (nff? (disj-left f)) + (nff? (disj-right f)))] + [else (error "Zła formuła -- NFF?" f)])) + +(define (convert-to-nnf f) + (cond [(lit? f) f] + [(neg? f) (convert-negation (neg-subf f))] + [(conj? f) (make-conj (convert-to-nnf (conj-left f)) + (convert-to-nnf (conj-right f)))] + [(disj? f) (make-disj (convert-to-nnf (disj-left f)) + (convert-to-nnf (disj-right f)))] + [else (error "Zła formuła -- CONVERT" f)])) + +(define (convert-negation f) + (cond [(lit? f) + (if (var? f) + (make-neg f) + (neg-subf f))] + [(neg? f) (convert-to-nnf (neg-subf f))] + [(conj? f) (make-disj (convert-negation (conj-left f)) + (convert-negation (conj-right f)))] + [(disj? f) (make-conj (convert-negation (disj-left f)) + (convert-negation (disj-right f)))] + [else (error "Zła formuła -- CONVERT-NEGATION" f)])) + +(define (clause? x) + (and (list? x) + (andmap lit? x))) + +(define (clause-empty? x) + (and (clause? x) + (null? x))) + +(define (cnf? x) + (and (list? x) + (andmap clause? x))) + +(define (flatmap proc seq) + (foldl append null (map proc seq))) + +(define (convert-to-cnf f) + (define (convert f) + (cond [(lit? f) (list (list f))] + [(conj? f) (append (convert-to-cnf (conj-left f)) + (convert-to-cnf (conj-right f)))] + [(disj? f) + (let ((clause-left (convert-to-cnf (disj-left f))) + (clause-right (convert-to-cnf (disj-right f)))) + (flatmap (λ (clause) + (map (λ (clause2) + (append clause2 clause)) clause-left)) + clause-right))])) + (convert (convert-to-nnf f))) + +(define (falsifable-clause? clause) + (cond [(clause-empty? clause) true] + [(lit? (findf (λ (l) (equal? + l + (convert-to-nnf (make-neg (car clause))))) + clause)) false] + [else (falsifable-clause? (cdr clause))])) + +(define (falsifable-cnf? f) + (define (neg-value lit) + (if (var? lit) + (list lit false) + (list (neg-subf lit) true))) + (ormap (λ (clause) (if (falsifable-clause? clause) + (map neg-value clause) + false)) + (convert-to-cnf f)))
\ No newline at end of file diff --git a/Semestr 2/racket/cw.rkt b/Semestr 2/racket/cw.rkt new file mode 100644 index 0000000..f1e706f --- /dev/null +++ b/Semestr 2/racket/cw.rkt @@ -0,0 +1,57 @@ +#lang racket + +(define (accumulate op initial sequence) + (if (null? sequence) + initial + (op (car sequence) + (accumulate op initial (cdr sequence))))) + +(define (horner-eval x coefficient-sequence) + (accumulate (lambda (this-coeff higher-terms) + (+ this-coeff (* x higher-terms))) + 0 + coefficient-sequence)) + + +(define (accumulate-n op init seqs) + (if (null? (car seqs)) + null + (cons (accumulate op init (map car seqs)) + (accumulate-n op init (map cdr seqs))))) + +(define (count-leaves t) + (accumulate + 0 (map (lambda (x) + (if (not (pair? x)) + 1 + (count-leaves x))) t))) + +(define (flatmap proc seq) + (accumulate append null (map proc seq))) + +(define (prime? x) (= (modulo x 2) 1)) + +(define (prime-sum? pair) + (prime? (+ (car pair) (cadr pair)))) + +(define (make-pair-sum pair) + (list (car pair) (cadr pair) (+ (car pair) (cadr pair)))) + +(define (enumerate-interval low high) + (if (> low high) + null + (cons low (enumerate-interval (+ 1 low) high)))) + +(define (unique-pairs n) + (flatmap (lambda (i) + (map (lambda (j) (list j i)) + (enumerate-interval 1 (- i 1)))) + (enumerate-interval 1 n))) + +(define (prime-sum-pairs n) + (map make-pair-sum + (filter prime-sum? (unique-pairs n)))) + +(define (is-eq-s? s triplet) + (= s (accumulate + 0 triplet))) + +(define
\ No newline at end of file diff --git a/Semestr 2/racket/deriv.rkt b/Semestr 2/racket/deriv.rkt new file mode 100644 index 0000000..0eef9d2 --- /dev/null +++ b/Semestr 2/racket/deriv.rkt @@ -0,0 +1,47 @@ +#lang racket + +(define (variable? x) (symbol? x)) + +(define (same-variable? v1 v2) + (and (variable? v1) (variable? v2) (eq? v1 v2))) + +(define (=number? exp num) + (and (number? exp) (= exp num))) + +(define (make-sum a1 a2) + (cond ((=number? a1 0) a2) + ((=number? a2 0) a1) + ((and (number? a1) (number? a2) (+ a1 a2))) + (else (list '+ a1 a2)))) +(define (sum? x) + (and (pair? x) (eq? (car x) '+))) +(define (addend s) (cadr s)) +(define (augend s) (caddr s)) + +(define (make-product m1 m2) + (cond ((or (=number? m1 0) (=number? m2 0)) 0) + ((=number? m1 1) m2) + ((=number? m2 1) m1) + ((and (number? m1) (number? m2)) (* m1 m2)) + (else (list '* m1 m2)))) +(define (product? x) + (and (pair? x) (eq? (car x) '*))) +(define (multiplier p) (cadr p)) +(define (multiplicand p) (caddr p)) + +(define (deriv exp var) + (cond ((number? exp) 0) + ((variable? exp) + (if (same-variable? exp var) 1 0)) + ((sum? exp) + (make-sum (deriv (addend exp) var) + (deriv (augend exp) var))) + ((product? exp) + (make-sum + (make-product (multiplier exp) + (deriv (multiplicand exp) var)) + (make-product (deriv (multiplier exp) var) + (multiplicand exp)))) + (else + (error "Nieznany rodzaj wyrazenia -- DERIV" exp)))) +
\ No newline at end of file diff --git a/Semestr 2/racket/egzamin/rozw2.txt b/Semestr 2/racket/egzamin/rozw2.txt new file mode 100644 index 0000000..a70232e --- /dev/null +++ b/Semestr 2/racket/egzamin/rozw2.txt @@ -0,0 +1 @@ +Zasada indukcji dla
\ No newline at end of file diff --git a/Semestr 2/racket/egzamin/zad1.bak b/Semestr 2/racket/egzamin/zad1.bak new file mode 100644 index 0000000..6f1f7b4 --- /dev/null +++ b/Semestr 2/racket/egzamin/zad1.bak @@ -0,0 +1 @@ +#lang racket diff --git a/Semestr 2/racket/egzamin/zad1.rkt b/Semestr 2/racket/egzamin/zad1.rkt new file mode 100644 index 0000000..a90d2fd --- /dev/null +++ b/Semestr 2/racket/egzamin/zad1.rkt @@ -0,0 +1,300 @@ +#lang racket + +;; ZADANIE 1 +;; ========= + +;; W tym zadaniu rozważamy język WHILE (w formie z grubsza +;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o +;; lokalnym zakresie. + +;; Zadanie polega na dodaniu do języka procedur definiowanych na +;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie +;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o +;; dowolnym wybranym przez siebie modelu działania. W tym celu należy: +;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów +;; · rozszerzyć procedurę parsowania +;; · rozszerzyć ewaluator +;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia +;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić +;; w komentarzu, podobnie jak niniejsze polecenie. + +;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele +;; sensownych rozwiązań które stosowały liczne języki imperatywne w +;; historii — nie jest treścią zadania znalezienie *najlepszego*, +;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur +;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto +;; pokazać że ma się tego świadomość w słownym opisie jego działania. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (name) #:transparent) +(struct call-expr (name args) #:transparent) +(struct return-expr (val) #:transparent) + +(define (operator? x) + (member x '(+ * - / > < = >= <=))) + +(define (keyword? x) + (member x '(skip while if := func call return))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(var-expr x) + (and (symbol? x) + (not (keyword? x)))] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + +(struct skip () #:transparent) +(struct assign (id exp) #:transparent) +(struct if-cmd (exp ct cf) #:transparent) +(struct while (exp cmd) #:transparent) +(struct comp (left right) #:transparent) +(struct var-in (name expr cmd) #:transparent) +(struct function (name args cmd) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))] + [(while e c) (and (expr? e) (cmd? c))] + [(comp c1 c2) (and (cmd? c1) (cmd? c2))] + [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))] + [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))])) + +(define (prog? p) + (cmd? p)) + +(define (parse-expr p) + (cond + [(number? p) (const p)] + [(and (symbol? p) + (not (keyword? p))) + (var-expr p)] + [(and (list? p) + (= 3 (length p)) + (operator? (car p))) + (binop (first p) + (parse-expr (second p)) + (parse-expr (third p)))] + [(and (list? p) ; <------ wywołanie funkcji + (= (length p) 3) + (eq? (first p) 'call) + (symbol? (second p)) + (list? (third p))) + (call-expr (second p) (map parse-expr (third p)))] + [else false])) + +(define (parse-cmd q) + (cond + [(eq? q 'skip) (skip)] + [(and (list? q) + (= (length q) 3) + (eq? (second q) ':=)) + (assign (first q) (parse-expr (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'while)) + (while (parse-expr (second q)) (parse-cmd (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'var) + (list? (second q)) + (= (length (second q)) 2)) + (var-in (first (second q)) + (parse-expr (second (second q))) + (parse-cmd (third q)))] + [(and (list? q) ; <------ funkcje + (= (length q) 4) + (eq? (first q) 'func) + (symbol? (second q)) + (list? (third q)) + (andmap symbol? (third q))) + (function (second q) (third q) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 2) + (eq? (first q) 'return)) + (return-expr (parse-expr (second q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-comp (map parse-cmd q))] + [else false])) + +(define (desugar-comp cs) + (if (null? (cdr cs)) + (car cs) + (comp (car cs) + (desugar-comp (cdr cs))))) + +(define (value? v) + (number? v)) + +(struct mem (xs) #:transparent) + +(define (mem-lookup x m) + (define (assoc-lookup xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cdar xs)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane + (define (assoc-lookup xs) + (cond + [(null? xs) #f] + [(eq? x (caar xs) #t)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-update x v m) + (define (assoc-update xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cons (cons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (mem (assoc-update (mem-xs m)))) + +(define (mem-alloc x v m) + (mem (cons (cons x v) (mem-xs m)))) + +(define (mem-drop-last m) + (cond + [(null? (mem-xs m)) + (error "Deallocating from empty memory")] + [else + (mem (cdr (mem-xs m)))])) + +(define empty-mem + (mem null)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /] + ['< (lambda (x y) (if (< x y) 1 0))] + ['> (lambda (x y) (if (> x y) 1 0))] + ['= (lambda (x y) (if (= x y) 1 0))] + ['<= (lambda (x y) (if (<= x y) 1 0))] + ['>= (lambda (x y) (if (>= x y) 1 0))] + )) + +;; zał: (expr? e) i (mem? m) jest prawdą +;; (value? (eval e m)) jest prawdą +(define (eval e m) + (match e + [(const v) v] + [(var-expr x) (mem-lookup x m)] + [(binop op l r) + (let ((vl (eval l m)) + (vr (eval r m)) + (p (op->proc op))) + (p vl vr))] + [(call-expr name args) + (match (mem-lookup name m) + [(clo func-args cmd) + (if (= (length args) (length func-args)) + (let* ([func-mem (assign-values args func-args m)] + [final-mem (eval-cmd cmd func-mem)] + [ret (mem-lookup 'RETURN final-mem)]) + (if ret + ret + (error "No return statement in function" name))) + (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))] + [else (error "Undefined function" name)])])) + +(define (assign-values args func-args mem) + (if (null? args) + mem + (assign-values (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) mem)))) + + +(struct clo (args cmd)) + +;; zał: (cmd? c) (mem? m) +;; (mem? (eval-cmd c m)) +(define (eval-cmd c m) + (if (mem-lookup 'RETURN m) + m + (match c + [(skip) m] + [(assign x e) (mem-update x (eval e m) m)] + [(if-cmd e ct cf) (if (= (eval e m) 0) + (eval-cmd cf m) + (eval-cmd ct m))] + [(while e cw) (if (= (eval e m) 0) + m + (let* ((m1 (eval-cmd cw m)) + (m2 (eval-cmd c m1))) + m2))] + [(comp c1 c2) (let* ((m1 (eval-cmd c1 m)) + (m2 (eval-cmd c2 m1))) + m2)] + [(var-in x e c) (let* ((v (eval e m)) + (m1 (mem-alloc x v m)) + (m2 (eval-cmd c m1))) + (mem-drop-last m2))] + [(function name args cmd) + (mem-alloc name (clo args cmd) m)] + [(return-expr val) + (mem-update 'RETURN (eval val m) m)] + [_ (error "Unknown command" c "— likely a syntax error")]))) + + +(define (eval-prog p m) + (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m)))) + (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))]) + (match (mem-lookup 'main final-mem) + [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))])))) + +(define WHILE_FACT + '({func decr (x) + {(x := (- x 1)) + (return x)}} + {func main () + {(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (call decr (t)))}) + (return i)}} + )) + +(define TEST + '({func decr (x) (return (- x 1))} + {func main () + (var (x 1) + {(x := (+ x 1)) + (return (call decr (x)))})})) + +(define TEST2 + '({func decr (x) (return (- x 1))} + {func main () (return (call decr (3)))})) + +(define TEST3 + '({func sth (x) + {(i := -1) + (return x)}} + {func main () + {(i := 2) + (return (call sth (i)))}})) + +(define TEST4 + '(func f () + {return 1})) + +(define (fact n) + (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))]) + (eval-prog (parse-cmd WHILE_FACT) init-env))) + diff --git a/Semestr 2/racket/egzamin/zad1a.bak b/Semestr 2/racket/egzamin/zad1a.bak new file mode 100644 index 0000000..a90d2fd --- /dev/null +++ b/Semestr 2/racket/egzamin/zad1a.bak @@ -0,0 +1,300 @@ +#lang racket + +;; ZADANIE 1 +;; ========= + +;; W tym zadaniu rozważamy język WHILE (w formie z grubsza +;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o +;; lokalnym zakresie. + +;; Zadanie polega na dodaniu do języka procedur definiowanych na +;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie +;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o +;; dowolnym wybranym przez siebie modelu działania. W tym celu należy: +;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów +;; · rozszerzyć procedurę parsowania +;; · rozszerzyć ewaluator +;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia +;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić +;; w komentarzu, podobnie jak niniejsze polecenie. + +;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele +;; sensownych rozwiązań które stosowały liczne języki imperatywne w +;; historii — nie jest treścią zadania znalezienie *najlepszego*, +;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur +;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto +;; pokazać że ma się tego świadomość w słownym opisie jego działania. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (name) #:transparent) +(struct call-expr (name args) #:transparent) +(struct return-expr (val) #:transparent) + +(define (operator? x) + (member x '(+ * - / > < = >= <=))) + +(define (keyword? x) + (member x '(skip while if := func call return))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(var-expr x) + (and (symbol? x) + (not (keyword? x)))] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + +(struct skip () #:transparent) +(struct assign (id exp) #:transparent) +(struct if-cmd (exp ct cf) #:transparent) +(struct while (exp cmd) #:transparent) +(struct comp (left right) #:transparent) +(struct var-in (name expr cmd) #:transparent) +(struct function (name args cmd) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))] + [(while e c) (and (expr? e) (cmd? c))] + [(comp c1 c2) (and (cmd? c1) (cmd? c2))] + [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))] + [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))])) + +(define (prog? p) + (cmd? p)) + +(define (parse-expr p) + (cond + [(number? p) (const p)] + [(and (symbol? p) + (not (keyword? p))) + (var-expr p)] + [(and (list? p) + (= 3 (length p)) + (operator? (car p))) + (binop (first p) + (parse-expr (second p)) + (parse-expr (third p)))] + [(and (list? p) ; <------ wywołanie funkcji + (= (length p) 3) + (eq? (first p) 'call) + (symbol? (second p)) + (list? (third p))) + (call-expr (second p) (map parse-expr (third p)))] + [else false])) + +(define (parse-cmd q) + (cond + [(eq? q 'skip) (skip)] + [(and (list? q) + (= (length q) 3) + (eq? (second q) ':=)) + (assign (first q) (parse-expr (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'while)) + (while (parse-expr (second q)) (parse-cmd (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'var) + (list? (second q)) + (= (length (second q)) 2)) + (var-in (first (second q)) + (parse-expr (second (second q))) + (parse-cmd (third q)))] + [(and (list? q) ; <------ funkcje + (= (length q) 4) + (eq? (first q) 'func) + (symbol? (second q)) + (list? (third q)) + (andmap symbol? (third q))) + (function (second q) (third q) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 2) + (eq? (first q) 'return)) + (return-expr (parse-expr (second q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-comp (map parse-cmd q))] + [else false])) + +(define (desugar-comp cs) + (if (null? (cdr cs)) + (car cs) + (comp (car cs) + (desugar-comp (cdr cs))))) + +(define (value? v) + (number? v)) + +(struct mem (xs) #:transparent) + +(define (mem-lookup x m) + (define (assoc-lookup xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cdar xs)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane + (define (assoc-lookup xs) + (cond + [(null? xs) #f] + [(eq? x (caar xs) #t)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-update x v m) + (define (assoc-update xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cons (cons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (mem (assoc-update (mem-xs m)))) + +(define (mem-alloc x v m) + (mem (cons (cons x v) (mem-xs m)))) + +(define (mem-drop-last m) + (cond + [(null? (mem-xs m)) + (error "Deallocating from empty memory")] + [else + (mem (cdr (mem-xs m)))])) + +(define empty-mem + (mem null)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /] + ['< (lambda (x y) (if (< x y) 1 0))] + ['> (lambda (x y) (if (> x y) 1 0))] + ['= (lambda (x y) (if (= x y) 1 0))] + ['<= (lambda (x y) (if (<= x y) 1 0))] + ['>= (lambda (x y) (if (>= x y) 1 0))] + )) + +;; zał: (expr? e) i (mem? m) jest prawdą +;; (value? (eval e m)) jest prawdą +(define (eval e m) + (match e + [(const v) v] + [(var-expr x) (mem-lookup x m)] + [(binop op l r) + (let ((vl (eval l m)) + (vr (eval r m)) + (p (op->proc op))) + (p vl vr))] + [(call-expr name args) + (match (mem-lookup name m) + [(clo func-args cmd) + (if (= (length args) (length func-args)) + (let* ([func-mem (assign-values args func-args m)] + [final-mem (eval-cmd cmd func-mem)] + [ret (mem-lookup 'RETURN final-mem)]) + (if ret + ret + (error "No return statement in function" name))) + (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))] + [else (error "Undefined function" name)])])) + +(define (assign-values args func-args mem) + (if (null? args) + mem + (assign-values (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) mem)))) + + +(struct clo (args cmd)) + +;; zał: (cmd? c) (mem? m) +;; (mem? (eval-cmd c m)) +(define (eval-cmd c m) + (if (mem-lookup 'RETURN m) + m + (match c + [(skip) m] + [(assign x e) (mem-update x (eval e m) m)] + [(if-cmd e ct cf) (if (= (eval e m) 0) + (eval-cmd cf m) + (eval-cmd ct m))] + [(while e cw) (if (= (eval e m) 0) + m + (let* ((m1 (eval-cmd cw m)) + (m2 (eval-cmd c m1))) + m2))] + [(comp c1 c2) (let* ((m1 (eval-cmd c1 m)) + (m2 (eval-cmd c2 m1))) + m2)] + [(var-in x e c) (let* ((v (eval e m)) + (m1 (mem-alloc x v m)) + (m2 (eval-cmd c m1))) + (mem-drop-last m2))] + [(function name args cmd) + (mem-alloc name (clo args cmd) m)] + [(return-expr val) + (mem-update 'RETURN (eval val m) m)] + [_ (error "Unknown command" c "— likely a syntax error")]))) + + +(define (eval-prog p m) + (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m)))) + (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))]) + (match (mem-lookup 'main final-mem) + [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))])))) + +(define WHILE_FACT + '({func decr (x) + {(x := (- x 1)) + (return x)}} + {func main () + {(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (call decr (t)))}) + (return i)}} + )) + +(define TEST + '({func decr (x) (return (- x 1))} + {func main () + (var (x 1) + {(x := (+ x 1)) + (return (call decr (x)))})})) + +(define TEST2 + '({func decr (x) (return (- x 1))} + {func main () (return (call decr (3)))})) + +(define TEST3 + '({func sth (x) + {(i := -1) + (return x)}} + {func main () + {(i := 2) + (return (call sth (i)))}})) + +(define TEST4 + '(func f () + {return 1})) + +(define (fact n) + (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))]) + (eval-prog (parse-cmd WHILE_FACT) init-env))) + diff --git a/Semestr 2/racket/egzamin/zad1a.rkt b/Semestr 2/racket/egzamin/zad1a.rkt new file mode 100644 index 0000000..a587359 --- /dev/null +++ b/Semestr 2/racket/egzamin/zad1a.rkt @@ -0,0 +1,314 @@ +#lang racket + +;; ZADANIE 1 +;; ========= + +;; W tym zadaniu rozważamy język WHILE (w formie z grubsza +;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o +;; lokalnym zakresie. + +;; Zadanie polega na dodaniu do języka procedur definiowanych na +;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie +;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o +;; dowolnym wybranym przez siebie modelu działania. W tym celu należy: +;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów +;; · rozszerzyć procedurę parsowania +;; · rozszerzyć ewaluator +;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia +;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić +;; w komentarzu, podobnie jak niniejsze polecenie. + +;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele +;; sensownych rozwiązań które stosowały liczne języki imperatywne w +;; historii — nie jest treścią zadania znalezienie *najlepszego*, +;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur +;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto +;; pokazać że ma się tego świadomość w słownym opisie jego działania. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (name) #:transparent) +(struct call-expr (name args) #:transparent) +(struct return-expr (val) #:transparent) + +(define (operator? x) + (member x '(+ * - / > < = >= <=))) + +(define (keyword? x) + (member x '(skip while if := func call return))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(var-expr x) + (and (symbol? x) + (not (keyword? x)))] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + +(struct skip () #:transparent) +(struct assign (id exp) #:transparent) +(struct if-cmd (exp ct cf) #:transparent) +(struct while (exp cmd) #:transparent) +(struct comp (left right) #:transparent) +(struct var-in (name expr cmd) #:transparent) +(struct function (name args cmd) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))] + [(while e c) (and (expr? e) (cmd? c))] + [(comp c1 c2) (and (cmd? c1) (cmd? c2))] + [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))] + [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))])) + +(define (prog? p) + (cmd? p)) + +(define (parse-expr p) + (cond + [(number? p) (const p)] + [(and (symbol? p) + (not (keyword? p))) + (var-expr p)] + [(and (list? p) + (= 3 (length p)) + (operator? (car p))) + (binop (first p) + (parse-expr (second p)) + (parse-expr (third p)))] + [(and (list? p) ; <------ wywołanie funkcji + (= (length p) 3) + (eq? (first p) 'call) + (symbol? (second p)) + (list? (third p))) + (call-expr (second p) (map parse-expr (third p)))] + [else false])) + +(define (parse-cmd q) + (cond + [(eq? q 'skip) (skip)] + [(and (list? q) + (= (length q) 3) + (eq? (second q) ':=)) + (assign (first q) (parse-expr (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'while)) + (while (parse-expr (second q)) (parse-cmd (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'var) + (list? (second q)) + (= (length (second q)) 2)) + (var-in (first (second q)) + (parse-expr (second (second q))) + (parse-cmd (third q)))] + [(and (list? q) ; <------ funkcje + (= (length q) 4) + (eq? (first q) 'func) + (symbol? (second q)) + (list? (third q)) + (andmap symbol? (third q))) + (function (second q) (third q) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 2) + (eq? (first q) 'return)) + (return-expr (parse-expr (second q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-comp (map parse-cmd q))] + [else false])) + +(define (desugar-comp cs) + (if (null? (cdr cs)) + (car cs) + (comp (car cs) + (desugar-comp (cdr cs))))) + +(define (value? v) + (number? v)) + +(struct mem (xs) #:transparent) + +(define (mem-lookup x m) + (define (assoc-lookup xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cdar xs)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane + (define (assoc-lookup xs) + (cond + [(null? xs) #f] + [(eq? x (caar xs) #t)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-update x v m) + (define (assoc-update xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cons (cons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (mem (assoc-update (mem-xs m)))) + +(define (mem-alloc x v m) + (mem (cons (cons x v) (mem-xs m)))) + +(define (mem-drop-last m) + (cond + [(null? (mem-xs m)) + (error "Deallocating from empty memory")] + [else + (mem (cdr (mem-xs m)))])) + +(define empty-mem + (mem null)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /] + ['< (lambda (x y) (if (< x y) 1 0))] + ['> (lambda (x y) (if (> x y) 1 0))] + ['= (lambda (x y) (if (= x y) 1 0))] + ['<= (lambda (x y) (if (<= x y) 1 0))] + ['>= (lambda (x y) (if (>= x y) 1 0))] + )) + +;; zał: (expr? e) i (mem? m) jest prawdą +;; (value? (eval e m)) jest prawdą +(define (eval e m) + (match e + [(const v) v] + [(var-expr x) (mem-lookup x m)] + [(binop op l r) + (let ((vl (eval l m)) + (vr (eval r m)) + (p (op->proc op))) + (p vl vr))] + [(call-expr name args) + (match (mem-lookup name m) + [(clo func-args cmd) + (if (= (length args) (length func-args)) + (let* ([func-mem (assign-values args func-args m)] + [final-mem (eval-cmd cmd func-mem)] + [ret (mem-lookup 'RETURN final-mem)]) + (if ret + ret + (error "No return statement in function" name))) + (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))] + [else (error "Undefined function" name)])])) + +(define (assign-values args func-args mem) + (define (iter args func-args new-mem) + (if (null? args) + new-mem + (iter (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) new-mem)))) + (iter args func-args mem)) + + +(struct clo (args cmd)) + +;; zał: (cmd? c) (mem? m) +;; (mem? (eval-cmd c m)) +(define (eval-cmd c m) + (if (mem-lookup 'RETURN m) + m + (match c + [(skip) m] + [(assign x e) (mem-update x (eval e m) m)] + [(if-cmd e ct cf) (if (= (eval e m) 0) + (eval-cmd cf m) + (eval-cmd ct m))] + [(while e cw) (if (= (eval e m) 0) + m + (let* ((m1 (eval-cmd cw m)) + (m2 (eval-cmd c m1))) + m2))] + [(comp c1 c2) (let* ((m1 (eval-cmd c1 m)) + (m2 (eval-cmd c2 m1))) + m2)] + [(var-in x e c) (let* ((v (eval e m)) + (m1 (mem-alloc x v m)) + (m2 (eval-cmd c m1))) + (mem-drop-last m2))] + [(function name args cmd) + (mem-alloc name (clo args cmd) m)] + [(return-expr val) + (mem-update 'RETURN (eval val m) m)] + [_ (error "Unknown command" c "— likely a syntax error")]))) + + +(define (eval-prog p m) + (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m)))) + (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))]) + (match (mem-lookup 'main final-mem) + [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))])))) + +(define WHILE_FACT + '({func decr (x) + {(x := (- x 1)) + (return x)}} + {func main () + {(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (call decr (t)))}) + (return i)}} + )) + +(define (fact n) + (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))]) + (eval-prog (parse-cmd WHILE_FACT) init-env))) + +(define TEST + '({func decr (x) (return (- x 1))} + {func main () + (var (x 1) + {(x := (+ x 1)) + (return (call decr (x)))})})) + +(define TEST2 + '({func decr (x) (return (- x 1))} + {func main () (return (call decr (3)))})) + +(define TEST3 + '({func sth (x) + {(i := -1) + (return x)}} + {func main () + {(i := 2) + (return (call sth (i)))}})) + +(define TEST4 + '(func f () + {return 1})) + +(define TEST5 + '({func f1 (x y z) + (return y)} + {func f2 (x y z) + (return (+ (+ x y) z))} + {func main () + {(if (> 4 3) + (var (x 2) + (return (call f1 (1 x 3)))) + (x := 5)) + (return (call f2 (x 3 4)))}})) +
\ No newline at end of file diff --git a/Semestr 2/racket/egzamin/zad1b.bak b/Semestr 2/racket/egzamin/zad1b.bak new file mode 100644 index 0000000..a587359 --- /dev/null +++ b/Semestr 2/racket/egzamin/zad1b.bak @@ -0,0 +1,314 @@ +#lang racket + +;; ZADANIE 1 +;; ========= + +;; W tym zadaniu rozważamy język WHILE (w formie z grubsza +;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o +;; lokalnym zakresie. + +;; Zadanie polega na dodaniu do języka procedur definiowanych na +;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie +;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o +;; dowolnym wybranym przez siebie modelu działania. W tym celu należy: +;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów +;; · rozszerzyć procedurę parsowania +;; · rozszerzyć ewaluator +;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia +;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić +;; w komentarzu, podobnie jak niniejsze polecenie. + +;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele +;; sensownych rozwiązań które stosowały liczne języki imperatywne w +;; historii — nie jest treścią zadania znalezienie *najlepszego*, +;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur +;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto +;; pokazać że ma się tego świadomość w słownym opisie jego działania. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (name) #:transparent) +(struct call-expr (name args) #:transparent) +(struct return-expr (val) #:transparent) + +(define (operator? x) + (member x '(+ * - / > < = >= <=))) + +(define (keyword? x) + (member x '(skip while if := func call return))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(var-expr x) + (and (symbol? x) + (not (keyword? x)))] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + +(struct skip () #:transparent) +(struct assign (id exp) #:transparent) +(struct if-cmd (exp ct cf) #:transparent) +(struct while (exp cmd) #:transparent) +(struct comp (left right) #:transparent) +(struct var-in (name expr cmd) #:transparent) +(struct function (name args cmd) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))] + [(while e c) (and (expr? e) (cmd? c))] + [(comp c1 c2) (and (cmd? c1) (cmd? c2))] + [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))] + [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))])) + +(define (prog? p) + (cmd? p)) + +(define (parse-expr p) + (cond + [(number? p) (const p)] + [(and (symbol? p) + (not (keyword? p))) + (var-expr p)] + [(and (list? p) + (= 3 (length p)) + (operator? (car p))) + (binop (first p) + (parse-expr (second p)) + (parse-expr (third p)))] + [(and (list? p) ; <------ wywołanie funkcji + (= (length p) 3) + (eq? (first p) 'call) + (symbol? (second p)) + (list? (third p))) + (call-expr (second p) (map parse-expr (third p)))] + [else false])) + +(define (parse-cmd q) + (cond + [(eq? q 'skip) (skip)] + [(and (list? q) + (= (length q) 3) + (eq? (second q) ':=)) + (assign (first q) (parse-expr (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'while)) + (while (parse-expr (second q)) (parse-cmd (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'var) + (list? (second q)) + (= (length (second q)) 2)) + (var-in (first (second q)) + (parse-expr (second (second q))) + (parse-cmd (third q)))] + [(and (list? q) ; <------ funkcje + (= (length q) 4) + (eq? (first q) 'func) + (symbol? (second q)) + (list? (third q)) + (andmap symbol? (third q))) + (function (second q) (third q) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 2) + (eq? (first q) 'return)) + (return-expr (parse-expr (second q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-comp (map parse-cmd q))] + [else false])) + +(define (desugar-comp cs) + (if (null? (cdr cs)) + (car cs) + (comp (car cs) + (desugar-comp (cdr cs))))) + +(define (value? v) + (number? v)) + +(struct mem (xs) #:transparent) + +(define (mem-lookup x m) + (define (assoc-lookup xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cdar xs)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-defined? x m) ; <----------- !!! Sprawdz, czy x jest w ogole zdefiniowane + (define (assoc-lookup xs) + (cond + [(null? xs) #f] + [(eq? x (caar xs) #t)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-update x v m) + (define (assoc-update xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cons (cons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (mem (assoc-update (mem-xs m)))) + +(define (mem-alloc x v m) + (mem (cons (cons x v) (mem-xs m)))) + +(define (mem-drop-last m) + (cond + [(null? (mem-xs m)) + (error "Deallocating from empty memory")] + [else + (mem (cdr (mem-xs m)))])) + +(define empty-mem + (mem null)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /] + ['< (lambda (x y) (if (< x y) 1 0))] + ['> (lambda (x y) (if (> x y) 1 0))] + ['= (lambda (x y) (if (= x y) 1 0))] + ['<= (lambda (x y) (if (<= x y) 1 0))] + ['>= (lambda (x y) (if (>= x y) 1 0))] + )) + +;; zał: (expr? e) i (mem? m) jest prawdą +;; (value? (eval e m)) jest prawdą +(define (eval e m) + (match e + [(const v) v] + [(var-expr x) (mem-lookup x m)] + [(binop op l r) + (let ((vl (eval l m)) + (vr (eval r m)) + (p (op->proc op))) + (p vl vr))] + [(call-expr name args) + (match (mem-lookup name m) + [(clo func-args cmd) + (if (= (length args) (length func-args)) + (let* ([func-mem (assign-values args func-args m)] + [final-mem (eval-cmd cmd func-mem)] + [ret (mem-lookup 'RETURN final-mem)]) + (if ret + ret + (error "No return statement in function" name))) + (error "Arity mismatch, function" name "takes" (length func-args) ", got" (length args)))] + [else (error "Undefined function" name)])])) + +(define (assign-values args func-args mem) + (define (iter args func-args new-mem) + (if (null? args) + new-mem + (iter (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) new-mem)))) + (iter args func-args mem)) + + +(struct clo (args cmd)) + +;; zał: (cmd? c) (mem? m) +;; (mem? (eval-cmd c m)) +(define (eval-cmd c m) + (if (mem-lookup 'RETURN m) + m + (match c + [(skip) m] + [(assign x e) (mem-update x (eval e m) m)] + [(if-cmd e ct cf) (if (= (eval e m) 0) + (eval-cmd cf m) + (eval-cmd ct m))] + [(while e cw) (if (= (eval e m) 0) + m + (let* ((m1 (eval-cmd cw m)) + (m2 (eval-cmd c m1))) + m2))] + [(comp c1 c2) (let* ((m1 (eval-cmd c1 m)) + (m2 (eval-cmd c2 m1))) + m2)] + [(var-in x e c) (let* ((v (eval e m)) + (m1 (mem-alloc x v m)) + (m2 (eval-cmd c m1))) + (mem-drop-last m2))] + [(function name args cmd) + (mem-alloc name (clo args cmd) m)] + [(return-expr val) + (mem-update 'RETURN (eval val m) m)] + [_ (error "Unknown command" c "— likely a syntax error")]))) + + +(define (eval-prog p m) + (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m)))) + (with-handlers ([exn:fail? (lambda (v) (error "Undefined reference to main"))]) + (match (mem-lookup 'main final-mem) + [(clo args cmd) (mem-lookup 'RETURN (eval-cmd cmd final-mem))])))) + +(define WHILE_FACT + '({func decr (x) + {(x := (- x 1)) + (return x)}} + {func main () + {(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (call decr (t)))}) + (return i)}} + )) + +(define (fact n) + (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))]) + (eval-prog (parse-cmd WHILE_FACT) init-env))) + +(define TEST + '({func decr (x) (return (- x 1))} + {func main () + (var (x 1) + {(x := (+ x 1)) + (return (call decr (x)))})})) + +(define TEST2 + '({func decr (x) (return (- x 1))} + {func main () (return (call decr (3)))})) + +(define TEST3 + '({func sth (x) + {(i := -1) + (return x)}} + {func main () + {(i := 2) + (return (call sth (i)))}})) + +(define TEST4 + '(func f () + {return 1})) + +(define TEST5 + '({func f1 (x y z) + (return y)} + {func f2 (x y z) + (return (+ (+ x y) z))} + {func main () + {(if (> 4 3) + (var (x 2) + (return (call f1 (1 x 3)))) + (x := 5)) + (return (call f2 (x 3 4)))}})) +
\ No newline at end of file diff --git a/Semestr 2/racket/egzamin/zad1b.rkt b/Semestr 2/racket/egzamin/zad1b.rkt new file mode 100644 index 0000000..628619f --- /dev/null +++ b/Semestr 2/racket/egzamin/zad1b.rkt @@ -0,0 +1,482 @@ +#lang racket + + + +;; Oświadczam, że rozwiązanie zadania egzaminacyjnego przygotowałem +;; w pełni samodzielnie, korzystając wyłącznie z materiałów do wykładu, +;; notatek, podręcznika, oraz materiałów zacytowanych w treści rozwiązania. +;; Oświadczam że nie korzystałem w żadnej formie z pomocy osób trzecich +;; w przygotowaniu rozwiązania ani też takiej pomocy nie udzielałem +;; i nie udostępniałem nikomu swojego rozwiązania. + +;; ZADANIE 1 +;; ========= + +;; W tym zadaniu rozważamy język WHILE (w formie z grubsza +;; odpowiadającej tej z wykładu), z blokami deklarującymi zmienne o +;; lokalnym zakresie. + +;; Zadanie polega na dodaniu do języka procedur definiowanych na +;; zewnątrz głównego polecenia programu (podobnie jak w C, gdzie +;; główne polecenie odpowiadałoby procedurze main, czy Pascalu) — o +;; dowolnym wybranym przez siebie modelu działania. W tym celu należy: +;; · rozszerzyć składnię abstrakcyjną o składnię procedur i rozbudować odpowiednio składnię programów +;; · rozszerzyć procedurę parsowania +;; · rozszerzyć ewaluator +;; · *opisać* wybrany model działania procedur, w tym jego potencjalne zalety lub ograniczenia +;; Należy rozszerzyć poniższy szablon, a część słowną zadania umieścić +;; w komentarzu, podobnie jak niniejsze polecenie. + +;; Uwaga! Zadanie jest *bardzo* szeroko sformułowane, jest wiele +;; sensownych rozwiązań które stosowały liczne języki imperatywne w +;; historii — nie jest treścią zadania znalezienie *najlepszego*, +;; tylko swojego, które *rozumiecie*. Wybrany model działania procedur +;; *może* być relatywnie ubogi, jednak jeśli tak się zrobi, warto +;; pokazać że ma się tego świadomość w słownym opisie jego działania. + + + + + + + +;; Postanowiłem, że struktura programów w moim języku będzie miała trochę z pythona i trochę z C. +;; Istotną decyzją którą podjąłem jest to, że wszystkie funkcje w naszym języku muszą zwracać +;; jakąś wartość (zawsze zwracają inta), łącznie z funkcją main, przy pomocy dyrektywy "return". +;; To, co zwraca main, jest tym co zwraca +;; cały program (z małym wyjątkiem, ale o tym później). Okazało się, że takie podejście +;; do sprawy jest bardzo wygodne -- nie musiałem się dzięki temu nawet przejmować +;; osobnym implementowaniem funkcji rekurencyjnych, wzajemnie rekurencyjnych +;; czy nawet zagnieżdżonych, a do tego można definiować funkcje w dowolnej kolejności! +;; Co więcej, funkcje przyjmują dowolnie wiele argumentów, również 0. +;; On top of that, do funkcji można przekazywać cokolwiek co ewaluuje się do wartości +;; Czyli mozna przekazywać wartości zmiennych, jak i dowolne wyrażenia! + +;; Oto przykładowy kod, po którym raczej jasno widać w jak wygląda nowa składnia: +(define BINOM '({func main () + (return (call binom (N K)))} + {func fact (t) + (if (= t 0) + (return 1) + ({func decr (x) (return (- x 1))} + (return (* t (call fact ((call decr (t))))))))} + {func binom (n k) + (if (= k 0) + (return 1) + (var (num (call fact (n))) + (var (den (* (call fact (k)) (call fact ((- n k))))) + (return (/ num den)))))} + )) +(define (bin n k) + (eval-prog (parse-cmd BINOM) (mem-alloc 'i 1 (mem-alloc 'N n (mem-alloc 'K k empty-mem))))) +;; Specjalnie trochę pokomplikowałem, ale widać featury naszego języka. + +;; Jak to w ogóle działa? + +;; Za każdym razem, kiedy definiuję funkcję, to do środowiska dodaję parę (nazwa funkcji . clo), +;; gdzie clo jest takim quasi-domknięciem, jest to po prostu struktura trzymająca nazwy +;; argumentów funkcji oraz jej ciało. Właśnie takie podejście bardzo dobrze +;; załatwiło łatwość w definiowaniu funkcji rekurencyjnych oraz wzajemnie rekurencyjnych i +;; zagnieżdżonych -- żadna funkcja nie zostanie wywołana, dopóki nie wywołam maina, +;; a tego wywołam dopiero po zewaluowaniu wszystkich definicji (tym samym dodaniu ich do środowiska). + +;; Takie podejście ma trochę problemów, chyba największym z nich jest to, że nie ma możliwości +;; zmiany wartości globalnych wewnątrz funkcji. Tj. możemy je zmieniać, ale zmiany będą +;; widoczne jedynie w jej lokalnym zakresie. +;; W zasadzie nie jest to aż tak bolesne -- globalne zmienne możemy traktować po prostu +;; jak argumenty wywołania funkcji main. + +;; Wywoływać funkcję mogę tylko za pomocą specjalnego wyrażenia call, +;; które jako pierwszy argument +;; przyjmuje nazwę funkcji, a jako drugi przyjmuje listę argumentów. +;; Żeby wiedzieć jak działa call, spójrzmy najpierw jak działa return. + +;; return napisane jest tak, że jeśli w jakimkolwiek miejscu funkcji +;; się na niego trafi, to reszta funkcji nie jest już wywoływana +;; (czyli tak jakbyśmy sie spodziewali). Jak on w sumie działa? +;; Na samym początku eval-prog, zanim zacznę w ogóle ewaluować definicje funkcji, +;; dodaje do środowiska specjalną zmienną o nazwie RETURN o wartości #f. +;; Jeśli w funkcji gdziekolwiek wywołam returna, to +;; zmieniam wartość RETURN w środowisku na to, co chcę zwrócić. +;; W eval-cmd za każdym razem sprawdzam jaka jest wartość RETURN. +;; Jeśli jest to #f, to pracuje jakby nigdy nic, a jeśli jest to coś innego, +;; to po prostu zwracam aktualne środowisko. +;; Zatem funkcja zwraca środowisko, w którym zmienna RETURN +;; ustawiona jest na wynik jej obliczenia. + +;; Teraz już prosto widać, że jedyne co robi call, to szuka ciała funkcji +;; w środowisku i wywołuje ją dla podanych argumentów, dostaje od tej +;; funkcji środowisko, a następnie odzyskuje wartość RETURN w zwróconym +;; przez nią środowisku. Dzięki temu po wywołaniu funkcji +;; wewnątrz innej funkcji nie zmienią się wartości żadnych zmiennych (w tym globalnych). +;; Jest to dosyć podobne do pythona -- tam inty są immutable i nie można ich wysłać przez +;; referencję. Ale możemy to robić jeśli się uprzemy np. tak: +;; {func decr (x) +;; (return (- x 1))} +;; {func main () +;; {(i := (call decr (i))) +;; (return i)} +;; Uruchomienie takiego programu ze zmienną globalną i zwróci oczywiście i-1. + +;; Mały problem którego za bardzo nie umiem rozwiązać jest taki, że jeśli gdzieś poza +;; jakąkolwiek funkcją wywołam return, to wartość którą tam zwrócę będzie +;; wartością dla całego programu, bo zmienna RETURN w środowisku zmieni swoją wartość +;; na coś innego od #f i niestety main nawet się nie wykona (na samym wstępie stwierdzi, +;; że coś zostało już zwrócone). Widać to w TEST10. Generalnie co za tym idzie, +;; między definicjami funkcji mogą być jakieś instrukcje, które zostaną +;; wywołane razem z ewaluacją programu, zanim zostanie wywołany main. + +;; Dodatkowe informacje umieściłem w komentarzach w odpowiednich miejscach pliku. +;; Na dole umieściłem kilka testów które pokazują co jak działa. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (name) #:transparent) +(struct call-expr (name args) #:transparent) ;; wywołanie funkcji + +(define (operator? x) + (member x '(+ * - / > < = >= <=))) + +(define (keyword? x) + (member x '(skip while if := func func-rec call return))) ;; kilka nowych słów kluczowych + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(var-expr x) + (and (symbol? x) + (not (keyword? x)))] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [(call-expr n a) + (and (symbol? n) + (list? a) + (andmap expr? a))] + [_ false])) + +(struct skip () #:transparent) +(struct assign (id exp) #:transparent) +(struct if-cmd (exp ct cf) #:transparent) +(struct while (exp cmd) #:transparent) +(struct comp (left right) #:transparent) +(struct var-in (name expr cmd) #:transparent) +(struct function (name args cmd) #:transparent) ;; dodane funkcje, funkcje rekurencyjne oraz return +(struct funcrec (name args cmd) #:transparent) +(struct return-stat (exp) #:transparent) + +(define (cmd? c) + (match c + [(skip) true] + [(assign x e) (and (symbol? x) (expr? e))] + [(if-cmd e ct cf) (and (expr? e) (cmd? ct) (cmd? cf))] + [(while e c) (and (expr? e) (cmd? c))] + [(comp c1 c2) (and (cmd? c1) (cmd? c2))] + [(var-in x e c) (and (symbol? x) (expr? e) (cmd? c))] + [(function f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))] + [(funcrec f a c) (and (symbol? f) (list? a) (andmap symbol? a) (cmd? c))] + [(return-stat exp) (expr? exp)])) + +(define (prog? p) + (cmd? p)) + +(define (parse-expr p) + (cond + [(number? p) (const p)] + [(and (symbol? p) + (not (keyword? p))) + (var-expr p)] + [(and (list? p) + (= 3 (length p)) + (operator? (car p))) + (binop (first p) + (parse-expr (second p)) + (parse-expr (third p)))] + [(and (list? p) ; <------ wywołanie funkcji + (= (length p) 3) + (eq? (first p) 'call) + (symbol? (second p)) + (list? (third p))) + (call-expr (second p) (map parse-expr (third p)))] + [else false])) + +(define (parse-cmd q) + (cond + [(eq? q 'skip) (skip)] + [(and (list? q) + (= (length q) 3) + (eq? (second q) ':=)) + (assign (first q) (parse-expr (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-cmd (parse-expr (second q)) (parse-cmd (third q)) (parse-cmd (fourth q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'while)) + (while (parse-expr (second q)) (parse-cmd (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'var) + (list? (second q)) + (= (length (second q)) 2)) + (var-in (first (second q)) + (parse-expr (second (second q))) + (parse-cmd (third q)))] + [(and (list? q) ; <------ funkcje + (= (length q) 4) + (eq? (first q) 'func) + (symbol? (second q)) + (list? (third q)) + (andmap symbol? (third q))) + (function (second q) (third q) (parse-cmd (fourth q)))] + [(and (list? q) ; <------ return + (= (length q) 2) + (eq? (first q) 'return)) + (return-stat (parse-expr (second q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-comp (map parse-cmd q))] + [else false])) + +(define (desugar-comp cs) + (if (null? (cdr cs)) + (car cs) + (comp (car cs) + (desugar-comp (cdr cs))))) + +(define (value? v) + (number? v)) + +(struct mem (xs) #:transparent) + +(define (mem-lookup x m) + (define (assoc-lookup xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cdar xs)] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (mem-xs m))) + +(define (mem-update x v m) + (define (assoc-update xs) + (cond + [(null? xs) (error "Undefined variable" x)] + [(eq? x (caar xs)) (cons (cons x v) (cdr xs))] + [else (cons (car xs) (assoc-update (cdr xs)))])) + (mem (assoc-update (mem-xs m)))) + +(define (mem-alloc x v m) + (mem (cons (cons x v) (mem-xs m)))) + +(define (mem-drop-last m) + (cond + [(null? (mem-xs m)) + (error "Deallocating from empty memory")] + [else + (mem (cdr (mem-xs m)))])) + +(define empty-mem + (mem null)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /] + ['< (lambda (x y) (if (< x y) 1 0))] + ['> (lambda (x y) (if (> x y) 1 0))] + ['= (lambda (x y) (if (= x y) 1 0))] + ['<= (lambda (x y) (if (<= x y) 1 0))] + ['>= (lambda (x y) (if (>= x y) 1 0))] + )) + +;; zał: (expr? e) i (mem? m) jest prawdą +;; (value? (eval e m)) jest prawdą +(define (eval e m) + (match e + [(const v) v] + [(var-expr x) (mem-lookup x m)] + [(binop op l r) + (let ((vl (eval l m)) + (vr (eval r m)) + (p (op->proc op))) + (p vl vr))] + [(call-expr name args) ;; <------ ewaluacja wywołania funkcji + (match (mem-lookup name m) + [(clo func-args cmd) + (if (= (length args) (length func-args)) ;; <------ sprawdzanie arnosci + (let* ([func-mem (assign-values args func-args m)] + [final-mem (eval-cmd cmd func-mem)] + [ret (mem-lookup 'RETURN final-mem)]) + (if ret + ret + (error "No return statement in function" name))) + (error "Arity mismatch, function" name "takes" (length func-args) "arguments, got" (length args)))] + [else (error "Undefined function" name)])])) + +(define (assign-values args func-args mem) ;; <------ przypisanie wartosci do argumentow funkcji + (define (iter args func-args new-mem) + (if (null? args) + new-mem + (iter (cdr args) (cdr func-args) (mem-alloc (car func-args) (eval (car args) mem) new-mem)))) + (iter args func-args mem)) + + +(struct clo (args cmd)) ; <----- tak trzymana jest funkcja w środowisku, tj. jako lista nazw argumentow i cialo funkcji + +;; zał: (cmd? c) (mem? m) +;; (mem? (eval-cmd c m)) +(define (eval-cmd c m) + (if (mem-lookup 'RETURN m) ; <----- jeśli RETURN jest na coś ustawione, to chcemy zrwócic pamięc + m + (match c + [(skip) m] + [(assign x e) (mem-update x (eval e m) m)] + [(if-cmd e ct cf) (if (= (eval e m) 0) + (eval-cmd cf m) + (eval-cmd ct m))] + [(while e cw) (if (= (eval e m) 0) + m + (let* ((m1 (eval-cmd cw m)) + (m2 (eval-cmd c m1))) + m2))] + [(comp c1 c2) (let* ((m1 (eval-cmd c1 m)) + (m2 (eval-cmd c2 m1))) + m2)] + [(var-in x e c) (let* ((v (eval e m)) + (m1 (mem-alloc x v m)) + (m2 (eval-cmd c m1))) + (mem-drop-last m2))] + [(function name args cmd) ; <------ dodanie ciała funkcji do środowiska + (mem-alloc name (clo args cmd) m)] + [(return-stat val) ; <------ zmiana wartości zmiennej RETURN + (mem-update 'RETURN (eval val m) m)] + [_ (error "Unknown command" c "— likely a syntax error")]))) + + +;; program ewaluowany jest tak +;; ewaluowane są wszystkie definicje funkcji, wtedy +;; ręcznie szukam definicji main i ewaluuje jej ciało i zwracam to co zwróci main. +;; zakładam, że main nie przyjmuje żadnych argumentów. +(define (eval-prog p m) + (let ((final-mem (eval-cmd p (mem-alloc 'RETURN #f m)))) + (match (mem-lookup 'main final-mem) + [(clo args cmd) + (let ((res (mem-lookup 'RETURN (eval-cmd cmd final-mem)))) + (if res res (error "No return statement in main")))]))) + +(define WHILE_FACT + '({func decr (x) + {(x := (- x 1)) + (return x)}} + {func main () + {(i := 1) + (while (> t 0) + {(i := (* i t)) + (t := (call decr (t)))}) + (return i)}} + )) + +(define (fact n) + (let* ([init-env (mem-alloc 'i 1 (mem-alloc 't n empty-mem))]) + (eval-prog (parse-cmd WHILE_FACT) init-env))) + +(define TEST + '({func decr (x) (return (- x 1))} + {func main () + (var (x 1) + {(x := (+ x 2)) + (return (call decr (x)))})})) +(define (test) (eval-prog (parse-cmd TEST) empty-mem)) + +(define TEST2 + '({func decr (x) (return (- x 1))} + {func main () (return (call decr (3)))})) +(define (test2) (eval-prog (parse-cmd TEST2) empty-mem)) + +; nie da się zmienić wartości zmiennej globalnej, zmienne są wysyłane przez kopie +(define TEST3 + '({func sth (x) + {(i := -1) + (return x)}} + {func main () + {(i := 2) + (return (call sth (i)))}})) +(define (test3) (eval-prog (parse-cmd TEST3) (mem-alloc 'i 3 empty-mem))) + +; nie ma maina, wywala błąd +(define TEST4 + '(func f () + {return 1})) +(define (test4) (eval-prog (parse-cmd TEST4) empty-mem)) + +; funkcje wieloargumentowe +(define TEST5 + '({func f1 (x y z) + (return y)} + {func f2 (x y z) + (return (+ (+ x y) z))} + {func main () + {(if (> X 3) + (var (x 2) + (return (call f1 (1 x 3)))) + (x := 5)) + (return (call f2 (x 3 4)))}})) +(define (test5) (eval-prog (parse-cmd TEST5) (mem-alloc 'x -1 (mem-alloc 'X 4 empty-mem)))) + +; Działa rekurencja!! +(define TEST6 + '({func f (x) + (if (= x 0) + (return 1) + (return (* x (call f ((- x 1))))))} + {func main () + (return (call f (X)))})) +(define (test6) (eval-prog (parse-cmd TEST6) (mem-alloc 'X 5 empty-mem))) + +; kolejnośc deklaracji funkcji nie ma znaczenia, można zagnieżdżać funkcje +(define TEST7 + '( + {func main () + (return (call f (2)))} + {func f (x) + (return (call f1 (x)))} + {func f1 (x) + {{func local-fun (x) + (return (+ 1 x))} + (return (call local-fun (x)))}})) +(define (test7) (eval-prog (parse-cmd TEST7) empty-mem)) + +; instrukcje poza jakimikolwiek funkcjami sa wykonywane przed wywołaniem main +(define TEST8 + '({func main () + (return i)} + (i := 2))) +(define (test8) (eval-prog (parse-cmd TEST8) (mem-alloc 'i 1 empty-mem))) + +; nic nie zwraca main, wywala błąd +(define TEST9 + '(func main () + (i := 1))) +(define (test9) (eval-prog (parse-cmd TEST9) (mem-alloc 'i 1 empty-mem))) + +; return poza jakąkolwiek funkcją jest wynikiem programu +(define TEST10 + '({func main () + (return i)} + (i := 2) + (return -1))) +(define (test10) (eval-prog (parse-cmd TEST10) (mem-alloc 'i 1 empty-mem))) + + +; arity mismatch +(define TEST11 + '({func main () + (return (call decr ()))} + {func decr (x) + (return (- x 1))})) +(define (test11) (eval-prog (parse-cmd TEST11) empty-mem)) diff --git a/Semestr 2/racket/egzamin/zad2.bak b/Semestr 2/racket/egzamin/zad2.bak new file mode 100644 index 0000000..02e2ae0 --- /dev/null +++ b/Semestr 2/racket/egzamin/zad2.bak @@ -0,0 +1,119 @@ +#lang racket + +;; ZADANIE 2 +;; ========= + +;; W tym zadaniu przyjrzymy się pierwszemu "językowi programowania" +;; który widzieliśmy na zajęciach: wyrażeniom arytmetycznym. Ich +;; prostota przejawia się przede wszystkim tym że nie występują w nich +;; zmienne (a w szczególności ich wiązanie) — dlatego możemy o nich +;; wnioskować nie używając narzędzi cięższych niż te poznane na +;; wykładzie. + +;; W tym zadaniu będziemy chcieli udowodnić że nasza prosta kompilacja +;; do odwrotnej notacji polskiej jest poprawna. Konkretniej, należy +;; · sformułować zasady indukcji dla obydwu typów danych +;; reprezentujących wyrażenia (expr? i rpn-expr?) +;; · sformułować i udowodnić twierdzenie mówiące że kompilacja +;; zachowuje wartość programu, tj. że obliczenie wartości programu +;; jest równoważne skompilowaniu go do RPN i obliczeniu. +;; · sformułować i udowodnić twierdzenie mówiące że translacja z RPN +;; do wyrażeń arytmetycznych (ta która była zadaniem domowym; +;; implementacja jest poniżej) jest (prawą) odwrotnością translacji +;; do RPN (czyli że jak zaczniemy od wyrażenia i przetłumaczymy do +;; RPN i z powrotem, to dostaniemy to samo wyrażenie). +;; Swoje rozwiązanie należy wpisać na końcu tego szablonu w +;; komentarzu, podobnie do niniejszej treści zadania; proszę zadbać o +;; czytelność dowodów! + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (operator? x) + (member x '(+ * - /))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + + +(define (value? v) + (number? v)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /])) + +;; zał: (expr? e) jest prawdą +;; (value? (eval e)) jest prawdą +(define (eval e) + (match e + [(const v) v] + [(binop op l r) + (let ((vl (eval l)) + (vr (eval r)) + (p (op->proc op))) + (p vl vr))])) + +(define (rpn-expr? e) + (and (list? e) + (pair? e) + (andmap (lambda (x) (or (number? x) (operator? x))) e))) + + +(struct stack (xs)) + +(define empty-stack (stack null)) +(define (empty-stack? s) (null? (stack-xs s))) +(define (top s) (car (stack-xs s))) +(define (push a s) (stack (cons a (stack-xs s)))) +(define (pop s) (stack (cdr (stack-xs s)))) + + +(define (eval-am e s) + (cond + [(null? e) (top s)] + [(number? (car e)) (eval-am (cdr e) (push (car e) s))] + [(operator? (car e)) + (let* ((vr (top s)) + (s (pop s)) + (vl (top s)) + (s (pop s)) + (v ((op->proc (car e)) vl vr))) + (eval-am (cdr e) (push v s)))])) + +(define (rpn-eval e) + (eval-am e empty-stack)) + +(define (arith->rpn e) + (match e + [(const v) (list v)] + [(binop op l r) (append (arith->rpn l) (arith->rpn r) (list op))])) + +(define (rpn-translate e s) + (cond + [(null? e) + (top s)] + + [(number? (car e)) + (rpn-translate (cdr e) (push (const (car e)) s))] + + [(operator? (car e)) + (let* ((er (top s)) + (s (pop s)) + (el (top s)) + (s (pop s)) + (en (binop (car e) el er))) + (rpn-translate (cdr e) (push en s)))])) + +(define (rpn->arith e) + (rpn-translate e empty-stack))
\ No newline at end of file diff --git a/Semestr 2/racket/egzamin/zad2.rkt b/Semestr 2/racket/egzamin/zad2.rkt new file mode 100644 index 0000000..e549f07 --- /dev/null +++ b/Semestr 2/racket/egzamin/zad2.rkt @@ -0,0 +1,186 @@ +#lang racket + +;; Oświadczam, że rozwiązanie zadania egzaminacyjnego przygotowałem +;; w pełni samodzielnie, korzystając wyłącznie z materiałów do wykładu, +;; notatek, podręcznika, oraz materiałów zacytowanych w treści rozwiązania. +;; Oświadczam że nie korzystałem w żadnej formie z pomocy osób trzecich +;; w przygotowaniu rozwiązania ani też takiej pomocy nie udzielałem +;; i nie udostępniałem nikomu swojego rozwiązania. + +;; ZADANIE 2 +;; ========= + +;; W tym zadaniu przyjrzymy się pierwszemu "językowi programowania" +;; który widzieliśmy na zajęciach: wyrażeniom arytmetycznym. Ich +;; prostota przejawia się przede wszystkim tym że nie występują w nich +;; zmienne (a w szczególności ich wiązanie) — dlatego możemy o nich +;; wnioskować nie używając narzędzi cięższych niż te poznane na +;; wykładzie. + +;; W tym zadaniu będziemy chcieli udowodnić że nasza prosta kompilacja +;; do odwrotnej notacji polskiej jest poprawna. Konkretniej, należy +;; · sformułować zasady indukcji dla obydwu typów danych +;; reprezentujących wyrażenia (expr? i rpn-expr?) +;; · sformułować i udowodnić twierdzenie mówiące że kompilacja +;; zachowuje wartość programu, tj. że obliczenie wartości programu +;; jest równoważne skompilowaniu go do RPN i obliczeniu. +;; · sformułować i udowodnić twierdzenie mówiące że translacja z RPN +;; do wyrażeń arytmetycznych (ta która była zadaniem domowym; +;; implementacja jest poniżej) jest (prawą) odwrotnością translacji +;; do RPN (czyli że jak zaczniemy od wyrażenia i przetłumaczymy do +;; RPN i z powrotem, to dostaniemy to samo wyrażenie). +;; Swoje rozwiązanie należy wpisać na końcu tego szablonu w +;; komentarzu, podobnie do niniejszej treści zadania; proszę zadbać o +;; czytelność dowodów! + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (operator? x) + (member x '(+ * - /))) + +(define (expr? e) + (match e + [(const v) + (integer? v)] + [(binop op l r) + (and (operator? op) + (expr? l) + (expr? r))] + [_ false])) + + +(define (value? v) + (number? v)) + +(define (op->proc op) + (match op + ['+ +] + ['- -] + ['* *] + ['/ /])) + +;; zał: (expr? e) jest prawdą +;; (value? (eval e)) jest prawdą +(define (eval e) + (match e + [(const v) v] + [(binop op l r) + (let ((vl (eval l)) + (vr (eval r)) + (p (op->proc op))) + (p vl vr))])) + +(define (rpn-expr? e) + (and (list? e) + (pair? e) + (andmap (lambda (x) (or (number? x) (operator? x))) e))) + +;; mój kod +(define (parse-expr q) + (cond + [(integer? q) (const q)] + [(and (list? q) (= (length q) 3) (operator? (first q))) + (binop (first q) (parse-expr (second q)) (parse-expr (third q)))])) + +(struct stack (xs)) + +(define empty-stack (stack null)) +(define (empty-stack? s) (null? (stack-xs s))) +(define (top s) (car (stack-xs s))) +(define (push a s) (stack (cons a (stack-xs s)))) +(define (pop s) (stack (cdr (stack-xs s)))) + + +(define (eval-am e s) + (cond + [(null? e) (top s)] + [(number? (car e)) (eval-am (cdr e) (push (car e) s))] + [(operator? (car e)) + (let* ((vr (top s)) + (s (pop s)) + (vl (top s)) + (s (pop s)) + (v ((op->proc (car e)) vl vr))) + (eval-am (cdr e) (push v s)))])) + +(define (rpn-eval e) + (eval-am e empty-stack)) + +(define (arith->rpn e) + (match e + [(const v) (list v)] + [(binop op l r) (append (arith->rpn l) (arith->rpn r) (list op))])) + +(define (rpn-translate e s) + (cond + [(null? e) + (top s)] + + [(number? (car e)) + (rpn-translate (cdr e) (push (const (car e)) s))] + + [(operator? (car e)) + (let* ((er (top s)) + (s (pop s)) + (el (top s)) + (s (pop s)) + (en (binop (car e) el er))) + (rpn-translate (cdr e) (push en s)))])) + +(define (rpn->arith e) + (rpn-translate e empty-stack)) + + +;; W kilku miejscach pozwoliłem sobie zapomnieć że symbol operatora i operator +;; to nie to samo, ale nie ma to znaczenia w kontekście dowodów. +;; Przez ES oznaczam empty-stack +;; +;; Zasada indukcji dla expr: +;; Dla dowolnej własności P, jeśli +;; · zachodzi P((const x)) dla dowolnego x oraz +;; · dla dowolnych e1, e2 oraz operator op jeśli zachodzi P(e1), P(e2) +;; to zachodzi P((binop op e1 e2)) +;; to dla dowolnego e, jeśli zachodzi (expr? e) to zachodzi P(e) +;; +;; Zasada indukcji dla rpn (ale tego wg rpn-expr?): +;; Dla dowolnej własności P, jeśli +;; · zachodzi P(x) dla dowolnej liczby lub opeartora x oraz +;; · dla dowolnej listy liczb lub operatorów xs oraz dowolnej liczby lub +;; operatora x, jesli zachodzi P(xs), to zachodzi P((cons x xs)) +;; to dla dowolnej listy xs liczb lub operatorów zachodzi P(xs) +;; +;; +;; Tw. 1: Jeśli spełnione jest (expr? e), to (eval e) ≡ (rpn-eval (arith->rpn e)) +;; +;; D-d. Skorzystamy z zasady indukcji dla wyrażeń. +;; · Weźmy dowolną liczbę x. Wtedy jeśli e ≡ (const x), to zachodzi +;; (eval (const x)) ≡ x ≡ (rpn-eval '(x)) ≡ (rpn-eval (arith->rpn (const x))) +;; · Weźmy dowolne e1, e2 spełniające naszą tezę oraz jakiś operator op. Wtedy +;; (eval (binop op e1 e2)) ≡ +;; (op (eval e1) (eval e2)) ≡ [Z definicji eval-am] +;; (eval-am '() (push (op (eval e1) (eval e2)) ES)) ≡ +;; (eval-am '(op) (push (eval e2) (push (eval e1) ES))) ≡ [Z założenia indukcyjnego] +;; (eval-am '(op) (push (rpn-eval (arith->rpn e2)) (push (eval e1) ES))) ≡ +;; (eval-am (append (arith->rpn e2) '(op)) (push (eval e1) ES)) ≡ [Z założenia indukcyjnego] +;; (eval-am (append (arith->rpn e1) (arith->rpn e2) '(op)) ES) ≡ +;; (rpn-eval (append (arith->rpn e1) (arith->rpn e2) '(op))) ≡ [Z definicji arith->rpn] +;; (rpn-eval (arith->rpn (binop op e1 e2))) +;; Pokazaliśmy oba warunki indukcji dla wyrażeń, zatem twierdzenie prawdziwe jest +;; dla dowolnego wyrażenia e spełniającego (expr? e). +;; +;; Tw. 2: Jeśli spełnione jest (expr? e), to (rpn->arith (arith->rpn e)) ≡ e +;; +;; D-d. Skoryzstamy z indukcji dla wyrażeń. +;; · Weźmy dowolną liczbę x. Wtedy dla e ≡ (const x) zachodzi +;; (rpn->arith (arith->rpn e)) ≡ (rpn->arith '(x)) ≡ (const x) +;; · Weźmy dowolne e1, e2 dla których twierdzenie zachodzi oraz operator op. Wtedy +;; (rpn->arith (arith->rpn (binop op e1 e2))) ≡ [Z definicji arith->rpn] +;; (rpn->arith (append (arith->rpn e1) (arith->rpn e2) '(op))) ≡ +;; (rpn-translate (append (arith->rpn e1) (arith->rpn e2) '(op)) ES) ≡ [Z zał. (arith->rpn e1) ewaluuje się do liczby] +;; (rpn-translate (append (arith->rpn e2) '(op)) (push e1 ES)) ≡ [Z zał. (arith->rpn e2) ewaluuje się do liczby] +;; (rpn-translate '(op) (push e2 (push e1 ES))) ≡ [Z definicji rpn-translate] +;; (rpn-translate '() (push (binop op e1 e2) ES)) ≡ +;; (binop op e1 e2) +;; Pokazaliśmy oba warunki indukcji dla wyrażeń, zatem twierdzenie jest prawdziwe +;; dla dowolnego e spełniającego (expr? e). diff --git a/Semestr 2/racket/egzamin/zad3.bak b/Semestr 2/racket/egzamin/zad3.bak new file mode 100644 index 0000000..20115e9 --- /dev/null +++ b/Semestr 2/racket/egzamin/zad3.bak @@ -0,0 +1,4 @@ +#lang racket + + + diff --git a/Semestr 2/racket/egzamin/zad3.rkt b/Semestr 2/racket/egzamin/zad3.rkt new file mode 100644 index 0000000..9bfed02 --- /dev/null +++ b/Semestr 2/racket/egzamin/zad3.rkt @@ -0,0 +1,347 @@ +#lang racket + +;; Oświadczam, że rozwiązanie zadania egzaminacyjnego przygotowałem +;; w pełni samodzielnie, korzystając wyłącznie z materiałów do wykładu, +;; notatek, podręcznika, oraz materiałów zacytowanych w treści rozwiązania. +;; Oświadczam że nie korzystałem w żadnej formie z pomocy osób trzecich +;; w przygotowaniu rozwiązania ani też takiej pomocy nie udzielałem +;; i nie udostępniałem nikomu swojego rozwiązania. + +;; ZADANIE 3 +;; ========= + +;; Z gramatykami bezkontekstowymi spotkaliście się już na Wstępie do +;; Informatyki. W tym zadaniu potraktujemy je jako dane dla naszych +;; programów. + +;; Przypomnijmy, że gramatyka bezkontekstowa składa się z +;; · skończonego zbioru *symboli nieterminalnych* +;; · skończonego zbioru *symboli terminalnych* +;; · wybranego nieterminalnego symbolu startowego +;; · zbioru *produkcji*, czyli par symbol nieterminalny - lista +;; (potencjalnie pusta) symboli terminalnych lub nieterminalnych + +;; Słowo (ciąg symboli terminalnych) możemy wyprowadzić z gramatyki, +;; jeśli możemy zacząć od ciągu składającego się z symbolu startowego +;; możemy użyć skończonej liczby produkcji z gramatyki przepisując +;; symbol nieterminalny na ciąg symboli mu odpowiadających (w danej +;; produkcji). + + +;; Przykład: poprawne nawiasowania + +;; Gramatyka składa się z jednego symbolu nieterminalnego, S (który +;; jest oczywiście symbolem startowym) i dwóch symboli terminalnych +;; "(" i ")", i zawiera następujące produkcje (zwyczajowo zapisywane +;; przy użyciu strzałki; zwróćcie uwagę że pierwszy ciąg jest pusty!): +;; S -> +;; S -> SS +;; S -> (S) + +;; W często spotykanej, bardziej zwięzłej, postaci BNF moglibyśmy tę +;; gramatykę zapisać tak (dbając trochę bardziej o wizualne +;; oddzielenie symboli terminalnych i nieterminalnych): +;; S ::= "" | SS | "(" S ")" +;; Mamy tu te same produkcje, ale tylko raz zapisujemy każdą z +;; powtarzających się lewych stron. + +;; Z gramatyki tej da się wyprowadzić wszystkie poprawnie rozstawione +;; ciągi nawiasów — zobaczmy jak wyprowadzić (na jeden ze sposobów) +;; ciąg "(()())". Zaczynamy, jak zawsze, od słowa złożonego z symbolu +;; startowego i przepisujemy: +;; S -> (S) -> (SS) -> ((S)S) -> ((S)(S)) -> (()(S)) -> (()()) + + +;; Zadanie cz. 1 + +;; Zdefiniuj reprezentację gramatyki jako typu danych w +;; Rackecie. Warto zastanowić się co można uprościć względem definicji +;; matematycznej — w szczególności możemy założyć że dowolne napisy +;; (typu string) są ciągami symboli terminalnych, i że nie musimy +;; podawać jawnie zbioru nieterminali; również reprezentacja produkcji +;; gramatyki jako worka z parami wejście-wyjście niekoniecznie jest +;; najwygodniejsza. + +;; Uwaga: w tym zadaniu nie wymagamy definiowania składni konkretnej i +;; parsowania, ale bardzo polecamy wybranie jakiejś formy, żeby móc +;; sensownie przetestować swoje rozwiązanie! + + +;; "Optymalizacja" gramatyk + +;; Gramatyki, podobnie jak programy, piszą ludzie — może więc zdarzyć +;; się że znajdą się tam śmieci. Mogą one mieć dwojaką formę: symboli +;; nieterminalnych, których nie da się wyprowadzić z symbolu +;; startowego, lub symboli nieterminalnych z których nie da się +;; wyprowadzić żadnego słowa terminalnego (tj. niezawierającego +;; symboli nieterminalnych). Przykładowo, do naszej gramatyki +;; moglibyśmy dodać symbole P i Q, i produkcje: +;; S -> ")(" P +;; P -> PP "qed" +;; Q -> "abc" + +;; Mimo że nasza gramatyka wygląda inaczej na pierwszy rzut oka, tak +;; naprawdę się nie zmieniła: do symbolu Q nie możemy dojść z symbolu +;; S, a więc "abc" nigdy nie wystąpi w słowie wyprowadzalnym z +;; gramatyki. Analogicznie, z P nie da się wyprowadzić żadnego słowa, +;; które nie zawierałoby symbolu P — a zatem żadnego słowa złożonego +;; tylko z symboli terminalnych. To znaczy, że naszą gramatykę możemy +;; uprościć wyrzucając z niej symbole nieterminalne (i produkcje które +;; ich używają) do których nie da się dojść (tj. są *nieosiągalne*) i +;; te, z których nie da się ułożyć słowa terminalnego (tj. są +;; *nieproduktywne*). Jeśli z naszej rozszerzonej gramatyki wyrzucimy +;; takie symbole, dostaniemy oczywiście gramatykę początkową. + + +;; Zadanie cz. 2 + +;; Dla swojej reprezentacji gramatyki z poprzedniej części zadania +;; napisz dwie procedury: cfg-unreachable, znajdującą symbole +;; nieterminalne które są nieosiągalne z symbolu startowego, i +;; cfg-unproductive, znajdującą symbole nieterminalne które nie są +;; produktywne. Następnie użyj tych procedur żeby zdefiniować +;; procedurę cfg-optimize, która uprości daną gramatykę usuwając z +;; niej symbole nieosiągalne i nieproduktywne, a także odpowiednie +;; produkcje. + +;; Rozwiązanie wpisz w poniższym pliku, i opatrz komentarzem +;; opisującym wybraną reprezentację (i podjęte przy jej projektowaniu +;; decyzje), a także zaimplementowane w cz. 2. algorytmy. + + + + + + +;; Zadanie 1 + +;; Reprezentacja jest docyś prosta, mianowicie stworzyłem struktury +;; terminal, non-terminal, rule oraz grammar. Dwa pierwsze to +;; po prostu jednoelementowe struktury utrzymujące nazwę symboli. +;; grammar to dwuelementowa struktura, jej pierwszym elementem +;; jest symbol startowy, a następnym produkcja, czyli lista reguł (listof rule), +;; a reguły to dwuelementowe struktury (symbol niterminalny - lista nonterminali lub termianli). +;; Generalnie dzięki temu, że mam te struktury terminal oraz non-terminal +;; to symbol nieterminalne i temrinalne mogą być czykolwiek. Dodatkowo +;; dla uproszczenia w miejscach, gdzie mam pewność że chodzi mi o +;; symbol nieterminalny, to nie opakowuję go w strukturę. +;; Przykładowo rules w gramatyce może wyglądać tak: +;; (list +;; (rule 'S (list (terminal ""))) +;; (rule 'S (list (non-terminal 'S) (non-terminal 'S))) +;; (rule 'S (list (terminal "(") (non-terminal 'S) (terminal ")")))) +;; Oczywiście symbol nieterminalny nie musi być racketowym symbolem, może być czymkolwiek. +;; Podobnie z symbolami terminalnymi. Proszę również zauważyć, że dzięki +;; strukturom non-terminal oraz terminal te same racketowe obiekty mogą być jednocześnie +;; terminalami oraz nieterminalami! +;; W tych parach na pierwszym miejscu nie jest non-terminal, tylko po prostu cokolwiek +;; no i oczywiście mam wtedy pewność że musi być to non-terminal, nie ma potrzeby +;; żeby pakować go również w tę strukturę. + + +;; Postanowiłem napisać parser (make-cfg q), generuje on gramatyki w bardzo konkretny sposób, +;; trochę ograniczo to czym mogą być symbole nieterminalne oraz terminalne, +;; ale nie wydaje mi się że i tak składnia jest bardzo wygodna i mało ograniczająca. + +;; Składnia konkretna naszych gramatyk wygląda bardzo podobnie do zapisu +;; przedstawionego w treści zadania. +;; np. gramatyka nawiasowania będzie wyglądać następująco: +;; '(grammar S (S ::= "" -- SS -- "(" S ")")) +;; ale mogłaby wyglądać też tak: +;; '(grammar S (S ::= "") (S ::= SS -- "(" S ")")) +;; a np. ta nieciekawa gramatyka przedstawiona w treści zadania: +;; '(grammar S (S ::= "] [" P) (P ::= PP "qed") (Q ::= "abc")) +;; Zatem będzie to lista, która na pierwszym miejscu ma symbol 'grammar +;; na drugim miejscu ma symbol startowy +;; następnie następuje lista produkcji w formacie: +;; <non-terminal> ::= <lista produkcji, produkcje oddzielone są separatorem --> +;; Zalety: +;; - rozróżnienie w składni konkretnej symboli nieterminalnych i terminalnych +;; przez użycie symboli i stringów pozwala na to, aby symbole terminalne nazywały się tak +;; jak terminalne, tj. "S" nie jest tym samym co 'S. +;; - składnia wydaje się bardzo wygodna w użyciu, nie ma też problemu, żeby później dopisać +;; dodatkowe reguły dla jakiegoś nieterminala, +;; - parser jest całkiem łatwy w implementacji +;; Wady: +;; - symbole nieterminalne mogą składać się jedynie z jednego symbolu, zatem nie możemy robić ich +;; zbyt wiele. Jest tak dlatego, że np. tutaj (S ::= SS) nie chodzi mi o symbol SS, tylko +;; o sąsiadujące symbole SS (jednak gdyby nie używać parsera to normalnie moglibyśmy +;; mieć wieloznakowe symbole nieterminalne!). + +;; Dla przykładu taka gramatyka: +;; '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QS -- "[" Q "]")) +;; będzie reprezentowana następująco: +;; (grammar +;; 'S +;; (list +;; (rule 'S (list (terminal ""))) +;; (rule 'S (list (non-terminal 'S) (non-terminal 'S))) +;; (rule 'S (list (terminal "(") (non-terminal 'S) (terminal ")"))) +;; (rule 'S (list (non-terminal 'Q))) +;; (rule 'Q (list (terminal ""))) +;; (rule 'Q (list (non-terminal 'Q) (non-terminal 'S))) +;; (rule 'Q (list (terminal "[") (non-terminal 'Q) (terminal "]"))))) + +;; Cała reprezentacja :D +(struct non-terminal (sym) #:transparent) +(struct terminal (sym) #:transparent) +(struct rule (nt xs) #:transparent) +(struct grammar (start rules) #:transparent) + + +;; PARSER +(define SEPARATOR '--) + +(define (split-at-symb symb xs) + (define (iter left right) + (cond + [(null? right) (cons left null)] + [(eq? symb (car right)) (cons left (cdr right))] + [else (iter (cons (car right) left) (cdr right))])) + (let ([res (iter null xs)]) + (cons (reverse (car res)) (cdr res)))) + +(define (split-by-separator xs) + (let ([res (split-at-symb SEPARATOR xs)]) + (if (null? (cdr res)) + res + (cons (car res) (split-by-separator (cdr res)))))) + +;; PARSER SKŁADNI KONKRETNEJ DO JEJ REPREZENTACJI +(define (make-cfg q) + (cond + [(and (list? q) (eq? 'grammar (first q))) + (grammar (second q) (append-map make-cfg (cddr q)))] + [(and (list? q) (eq? '::= (second q))) + (let ([nt (first q)] + [rules (split-by-separator (cddr q))]) + (map (lambda (x) (rule nt x)) (map make-prod rules)))])) + +(define (symbol->list s) + (map string->symbol + (map string + (string->list (symbol->string s))))) + +(define (make-prod xs) + (cond + [(null? xs) null] + [(string? (car xs)) (cons (terminal (car xs)) (make-prod (cdr xs)))] + [(symbol? (car xs)) (append (map non-terminal (symbol->list (car xs))) (make-prod (cdr xs)))] + [else (error "Invalid syntax in production" xs)])) + + +(define sample '(S ::= "" -- SS -- "(" S ")")) +(define sample2 '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QQ -- "[" Q "]"))) +(define sample3 '(grammar S + (S ::= A B -- D E) + (A ::= "a") + (B ::= "b" C) + (C ::= "c") + (D ::= "d" F) + (E ::= "e") + (F ::= "f" D))) + +(define (sample-grammar) (make-cfg sample3)) + +;; zadanie 2 + +;; korzystam z algorytmów przedstawionych w tej książce: +;; https://bit.ly/3ev0NUA, konkretnie te ze stron 50-51 +;; Pozwoliłem sobie trochę zmienić przeznaczenie funkcji cfg-unreachable oraz cfg-unproductive +;; Zamiast zwracać nieproduktywne nieterminale, zwracają właśnie produktywne +;; i analogicznie w tym drugim. Po prostu taka implementacja jest dla mnie wygodniejsza, +;; a jest bardzo nieistotną zmianą koncepcyjną. +;; Stąd zmiana nazwy na cfg-productive oraz cfg-reachable + +;; cfg-productive działa w ten sposób: +;; Jakiś nieterminal nazywamy produktywnym, jeśli ma co najmniej jedną produktywną zasadę +;; Jakąś regułę nazywamy produktywną, jeśli składa się z terminali lub produktywnych nieterminali +;; Jasno widać, że wg tej definicji te nieterminale, które nie są produktywne, są nieproduktywne +;; wg definicji zadania, a cała reszta jest produktwna. + +;; Algorytm znajdowania produktywnych nieterminali: +;; Mamy listę produktywnych nieterminali P, początkowo pustą +;; 1. Stwórz nową listę P' +;; 2. Przejdź po liście reguł +;; -> jeśli dana reguła jest produktywna (wg P), dodaj jej nieterminal do P' +;; 3. Jeśli P != P', zrób P := P' i wróć do 1. +;; 4. Zwróć P + +;; Fajne w tym algorytmie jest to, że jeśli mamy jakiś nieterminal, którego +;; używamy w jakiejś regule, ale ten nieterminal nie ma zdefiniowanej żadnej reguły, +;; to nie zostanie oznaczony jako produktywny, co jest dla nas korzystne. + +;; Algorytm znajdowania osiągalnych nieterminali: +;; Traktujemy nitereminale jak wierzchołki w grafie a reguły jako listy sąsiedztwa. +;; Terminale są liśćmi, a nieterminale węzłami. Robimy po prostu DFSa z nieterminala +;; startowego i węzły do których dotrzemy oznaczamy jako osiągalne. + +;; Wg papierka który tutaj podałem, jeśli najpierw usuniemy nieproduktywne nieterminale, +;; a w następnej kolejności nieosiągalne, to nasza gramatyka stanie się regularna. +;; Wydaje się to w miarę sensowne -- pierszy algorytm to takie odcinanie liści i odcyklanie +;; grafu, a ten drugi to po prostu DFS. + +;; przydatne predykaty -- na productive-nt mam listę symboli niterminalnych +;; (nie struktury non-terminal, tylko te symbole!) +;; które wiem że są produktywne. +;; productive? sprawdza, czy nietermial jest produktywny +;; to drugie sprawdza czy reguła jest produktywna +;; (czyli czy składa się z produktywnych nonterminali lub terminali) +(define (productive? p productive-nt) + (or (terminal? p) (member (non-terminal-sym p) productive-nt))) +(define (rule-productive? r productive-nt) + (andmap (lambda (x) (productive? x productive-nt)) r)) + +;; zwraca listę produktywnych symboli (nie nonterminali!) +(define (cfg-productive g) + (define (find-productive-nt productive-nt rules) + (cond + [(null? rules) (remove-duplicates productive-nt)] + [(rule-productive? (rule-xs (car rules)) productive-nt) + (find-productive-nt (cons (rule-nt (car rules)) productive-nt) (cdr rules))] + [else (find-productive-nt productive-nt (cdr rules))])) + (define (iter productive-nt) + (let ([new-prod-nt (find-productive-nt productive-nt (grammar-rules g))]) + (if (equal? productive-nt new-prod-nt) + productive-nt + (iter new-prod-nt)))) + (iter null)) + +;; zwraca listę osiągalnych symboli +(define (cfg-reachable g) + (define (iter verts vis) + (cond + [(null? verts) vis] + [(member (car verts) vis) (iter (cdr verts) vis)] + [else (iter (cdr verts) (dfs (car verts) vis))])) + (define (dfs v vis) + (let* ([rules (filter (lambda (r) (eq? (rule-nt r) v)) (grammar-rules g))] + [verts (append-map (lambda (r) (rule-xs r)) rules)] + [verts (filter non-terminal? verts)] + [verts (map non-terminal-sym verts)]) + (iter verts (cons v vis)))) + (dfs (grammar-start g) null)) + + +;; robi z gramatyki g gramatykę regularną +(define (cfg-optimize g) + (let* ([productive-nt (cfg-productive g)] + [productive-rules (filter (lambda (r) + (rule-productive? (rule-xs r) productive-nt)) + (grammar-rules g))] + [new-g (grammar (grammar-start g) productive-rules)] ; <----- nowa gramatyka, bez nieproduktywnych + [reachable-nt (cfg-reachable new-g)] ; reguł i symboli nieterminalnych + [res-g (grammar (grammar-start new-g) (filter ; <----- dobra gramatyka + (lambda (r) (member (rule-nt r) reachable-nt)) + (grammar-rules new-g)))]) + res-g)) + +(define (test) (cfg-optimize (make-cfg sample3))) + +;; Pokazanie że symbole nie muszą być racketowymi symbolami :) +(define (test2) (cfg-optimize + (grammar '() + (list (cons '() (list (terminal '()))) + (cons '() (list (terminal "(") (non-terminal '()) (terminal ")"))) + (cons '() (list (non-terminal '()) (non-terminal '()))))))) +
\ No newline at end of file diff --git a/Semestr 2/racket/egzamin/zad3a.bak b/Semestr 2/racket/egzamin/zad3a.bak new file mode 100644 index 0000000..81570d0 --- /dev/null +++ b/Semestr 2/racket/egzamin/zad3a.bak @@ -0,0 +1,298 @@ +#lang racket + +;; ZADANIE 3 +;; ========= + +;; Z gramatykami bezkontekstowymi spotkaliście się już na Wstępie do +;; Informatyki. W tym zadaniu potraktujemy je jako dane dla naszych +;; programów. + +;; Przypomnijmy, że gramatyka bezkontekstowa składa się z +;; · skończonego zbioru *symboli nieterminalnych* +;; · skończonego zbioru *symboli terminalnych* +;; · wybranego nieterminalnego symbolu startowego +;; · zbioru *produkcji*, czyli par symbol nieterminalny - lista +;; (potencjalnie pusta) symboli terminalnych lub nieterminalnych + +;; Słowo (ciąg symboli terminalnych) możemy wyprowadzić z gramatyki, +;; jeśli możemy zacząć od ciągu składającego się z symbolu startowego +;; możemy użyć skończonej liczby produkcji z gramatyki przepisując +;; symbol nieterminalny na ciąg symboli mu odpowiadających (w danej +;; produkcji). + + +;; Przykład: poprawne nawiasowania + +;; Gramatyka składa się z jednego symbolu nieterminalnego, S (który +;; jest oczywiście symbolem startowym) i dwóch symboli terminalnych +;; "(" i ")", i zawiera następujące produkcje (zwyczajowo zapisywane +;; przy użyciu strzałki; zwróćcie uwagę że pierwszy ciąg jest pusty!): +;; S -> +;; S -> SS +;; S -> (S) + +;; W często spotykanej, bardziej zwięzłej, postaci BNF moglibyśmy tę +;; gramatykę zapisać tak (dbając trochę bardziej o wizualne +;; oddzielenie symboli terminalnych i nieterminalnych): +;; S ::= "" | SS | "(" S ")" +;; Mamy tu te same produkcje, ale tylko raz zapisujemy każdą z +;; powtarzających się lewych stron. + +;; Z gramatyki tej da się wyprowadzić wszystkie poprawnie rozstawione +;; ciągi nawiasów — zobaczmy jak wyprowadzić (na jeden ze sposobów) +;; ciąg "(()())". Zaczynamy, jak zawsze, od słowa złożonego z symbolu +;; startowego i przepisujemy: +;; S -> (S) -> (SS) -> ((S)S) -> ((S)(S)) -> (()(S)) -> (()()) + + +;; Zadanie cz. 1 + +;; Zdefiniuj reprezentację gramatyki jako typu danych w +;; Rackecie. Warto zastanowić się co można uprościć względem definicji +;; matematycznej — w szczególności możemy założyć że dowolne napisy +;; (typu string) są ciągami symboli terminalnych, i że nie musimy +;; podawać jawnie zbioru nieterminali; również reprezentacja produkcji +;; gramatyki jako worka z parami wejście-wyjście niekoniecznie jest +;; najwygodniejsza. + +;; Uwaga: w tym zadaniu nie wymagamy definiowania składni konkretnej i +;; parsowania, ale bardzo polecamy wybranie jakiejś formy, żeby móc +;; sensownie przetestować swoje rozwiązanie! + + +;; "Optymalizacja" gramatyk + +;; Gramatyki, podobnie jak programy, piszą ludzie — może więc zdarzyć +;; się że znajdą się tam śmieci. Mogą one mieć dwojaką formę: symboli +;; nieterminalnych, których nie da się wyprowadzić z symbolu +;; startowego, lub symboli nieterminalnych z których nie da się +;; wyprowadzić żadnego słowa terminalnego (tj. niezawierającego +;; symboli nieterminalnych). Przykładowo, do naszej gramatyki +;; moglibyśmy dodać symbole P i Q, i produkcje: +;; S -> ")(" P +;; P -> PP "qed" +;; Q -> "abc" + +;; Mimo że nasza gramatyka wygląda inaczej na pierwszy rzut oka, tak +;; naprawdę się nie zmieniła: do symbolu Q nie możemy dojść z symbolu +;; S, a więc "abc" nigdy nie wystąpi w słowie wyprowadzalnym z +;; gramatyki. Analogicznie, z P nie da się wyprowadzić żadnego słowa, +;; które nie zawierałoby symbolu P — a zatem żadnego słowa złożonego +;; tylko z symboli terminalnych. To znaczy, że naszą gramatykę możemy +;; uprościć wyrzucając z niej symbole nieterminalne (i produkcje które +;; ich używają) do których nie da się dojść (tj. są *nieosiągalne*) i +;; te, z których nie da się ułożyć słowa terminalnego (tj. są +;; *nieproduktywne*). Jeśli z naszej rozszerzonej gramatyki wyrzucimy +;; takie symbole, dostaniemy oczywiście gramatykę początkową. + + +;; Zadanie cz. 2 + +;; Dla swojej reprezentacji gramatyki z poprzedniej części zadania +;; napisz dwie procedury: cfg-unreachable, znajdującą symbole +;; nieterminalne które są nieosiągalne z symbolu startowego, i +;; cfg-unproductive, znajdującą symbole nieterminalne które nie są +;; produktywne. Następnie użyj tych procedur żeby zdefiniować +;; procedurę cfg-optimize, która uprości daną gramatykę usuwając z +;; niej symbole nieosiągalne i nieproduktywne, a także odpowiednie +;; produkcje. + +;; Rozwiązanie wpisz w poniższym pliku, i opatrz komentarzem +;; opisującym wybraną reprezentację (i podjęte przy jej projektowaniu +;; decyzje), a także zaimplementowane w cz. 2. algorytmy. + + + + + + +;; Zadanie 1 + +;; Postanowiłem napisać parser, bo bez tego zadanie wydaje mi się dosyć ubogie +;; Składnia konkretna naszych gramatyk wygląda bardzo podobnie do zapisu +;; przedstawionego w treści zadania. +;; np. gramatyka nawiasowania będzie wyglądać następująco: +;; '(grammar S (S ::= "" -- SS -- "(" S ")")) +;; ale mogłaby wyglądać też tak: +;; '(grammar S (S ::= "") (S ::= SS -- "(" S ")")) +;; a np. ta nieciekawa gramatyka przedstawiona w treści zadania: +;; '(grammar S (S ::= "] [" P) (P ::= PP "qed") (Q ::= "abc")) +;; Zatem będzie to lista, która na pierwszym miejscu ma symbol 'grammar +;; na drugim miejscu ma symbol startowy +;; następnie następuje lista produkcji w formacie: +;; <non-terminal> ::= <lista produkcji, produkcje oddzielone są separatorem --> +;; Zalety: +;; - rozróżnienie w składni konkretnej symboli nieterminalnych i terminalnych +;; przez użycie symboli i stringów pozwala na to, aby symbole terminalne nazywały się tak +;; jak terminalne, tj. "S" nie jest tym samym co 'S. +;; - składnia wydaje się bardzo wygodna w użyciu, nie ma też problemu, żeby później dopisać +;; dodatkowe produkcje dla jednego symbolu nieterminalnego, np. (S ::= "") (S ::= SS) +;; - parser jest łatwy w implementacji +;; Wady: +;; - symbole nieterminalne mogą składać się jedynie z jednego symbolu, zatem nie możemy robić ich +;; zbyt wiele + +;; Reprezentacja gramatyki: podczas parsowania gramatyki symbole i stringi wewnątrz produkcji +;; reprezentowane są przez struktury terminal oraz non-terminal. Cała gramatyka to +;; struktura dwuelementowa - pierwszym jest symbol startowy, a drugim lista par <symbol . produkcja> +;; Taka decyzja właśnie pozwoliła na to, że zaproponowana przeze mnie składania konkretna jest +;; bardzo prosta do sparsowania - wystarczy każdą produkcję podzielić ze względu na separator '-- +;; i do czegoś podobnego do środowisk dodawać po prostu odpowiednie pary. +;; dla przykładu taka gramatyka: +;; '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QS -- "[" Q "]")) +;; będzie reprezentowana następująco: +;; (grammar +;; 'S +;; (production +;; (list +;; (list 'S (terminal "")) +;; (list 'S (non-terminal 'S) (non-terminal 'S)) +;; (list 'S (terminal "(") (non-terminal 'S) (terminal ")")) +;; (list 'S (non-terminal 'Q)) +;; (list 'Q (terminal "")) +;; (list 'Q (non-terminal 'Q) (non-terminal 'S)) +;; (list 'Q (terminal "[") (non-terminal 'Q) (terminal "]"))))) +;; Prosze zauważyć, że np. SS zostało zamienione na dwa sąsiednie nieterminalne symbole S +;; (to właśnie powód, dlaczego symbole nieterminalne mogą być jedynie jednoznakowe). + +;; Zdecydowałem się dodać strukturę production, bo wtedy łatwo można na niej operować +;; pisząc funkcje production-add, czy production-lookup itp. + + +(struct non-terminal (sym) #:transparent) +(struct terminal (sym) #:transparent) +(struct grammar (start rules) #:transparent) + +(define SEPARATOR '--) + +(define (split-at-symb symb xs) + (define (iter left right) + (cond + [(null? right) (cons left null)] + [(eq? symb (car right)) (cons left (cdr right))] + [else (iter (cons (car right) left) (cdr right))])) + (let ([res (iter null xs)]) + (cons (reverse (car res)) (cdr res)))) + +(define (split-by-separator xs) + (let ([res (split-at-symb SEPARATOR xs)]) + (if (null? (cdr res)) + res + (cons (car res) (split-by-separator (cdr res)))))) + +(define (make-cfg q) + (cond + [(and (list? q) (eq? 'grammar (first q))) + (grammar (second q) (append-map make-cfg (cddr q)))] + [(and (list? q) (eq? '::= (second q))) + (let ([nt (first q)] + [rules (split-by-separator (cddr q))]) + (map (lambda (x) (cons nt x)) (map make-prod rules)))])) + +(define (symbol->list s) + (map string->symbol + (map string + (string->list (symbol->string s))))) + +(define (make-prod xs) + (cond + [(null? xs) null] + [(string? (car xs)) (cons (terminal (car xs)) (make-prod (cdr xs)))] + [(symbol? (car xs)) (append (map non-terminal (symbol->list (car xs))) (make-prod (cdr xs)))] + [else (error "Invalid syntax in production" xs)])) + + +(define sample '(S ::= "" -- SS -- "(" S ")")) +(define sample2 '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QQ -- "[" Q "]"))) +(define sample3 '(grammar S + (S ::= A B -- D E) + (A ::= "a") + (B ::= "b" C) + (C ::= "c") + (D ::= "d" F) + (E ::= "e") + (F ::= "f" D))) + +;; zadanie 2 + +;; korzystam z algorytmów przedstawionych w tej książce: +;; https://bit.ly/3ev0NUA, konkretnie te ze stron 50-51 +;; Pozwoliłem sobie trochę zmienić przeznaczenie funkcji cfg-unreachable oraz cfg-unproductive +;; Zamiast zwracać nieproduktywne nieterminale, zwracają właśnie produktywne +;; i analogicznie w tym drugim. Po prostu taka implementacja jest dla mnie wygodniejsza, +;; a jest bardzo nieistotną zmianą koncepcyjną. +;; Stąd zmiana nazwy na cfg-productive oraz cfg-reachable + +;; cfg-productive działa w ten sposób: +;; Jakiś nieterminal nazywamy produktywnym, jeśli ma co najmniej jedną produktywną zasadę +;; Jakąś zasadę nazywamy produktywną, jeśli składa się z terminali oraz produktywnych nieterminali +;; Jasno widać, że wg tej definicji te nieterminale, które nie są produktywne, są nieproduktywne +;; wg definicji zadania, a cała reszta jest produktwna. + +;; Algorytm znajdowania produktywnych nieterminali: +;; Mamy listę produktywnych nieterminali P, początkowo pustą +;; 1. Stwórz nową listę P' +;; 2. Przejdź po liście produkcji +;; -> jeśli dana produkcja jest produktywna (wg P), dodaj jej nieterminal do P' +;; 3. Jeśli P != P', zrób P := P' i wróć do 1. +;; 4. Zwróć P + +;; Fajne w tym algorytmie jest to, że jeśli mamy jakiś nieterminal, którego +;; używamy w jakiejś produkcji, ale ten nieterminal nie ma zdefiniowanej swojej produkcji +;; to nie zostanie oznaczony jako produktywny, co jest dla nas korzystne + +;; Algorytm znajdowania osiągalnych nieterminali: +;; Traktujemy nitereminale jak wierzchołki w grafie a zasady jako listy sąsiedztwa. +;; Terminale są liśćmi, a nieterminale węzłami. Robimy po prostu DFSa z nieterminalu +;; startowego i węzły do których dotrzemy oznaczamy jako osiągalne. + +;; Wg papierka który tutaj podałem, jeśli najpierw usuniemy nieproduktywne nieterminale, +;; a w następnej kolejności nieosiągalne, to nasza gramatyka stanie się regularna. + +(define (productive? p productive-nt) + (or (terminal? p) (member (non-terminal-sym p) productive-nt))) +(define (rule-productive? r productive-nt) + (andmap (lambda (x) (productive? x productive-nt)) r)) + +(define (cfg-productive g) + (define (find-productive-nt productive-nt rules) + (cond + [(null? rules) (remove-duplicates productive-nt)] + [(rule-productive? (cdar rules) productive-nt) + (find-productive-nt (cons (caar rules) productive-nt) (cdr rules))] + [else (find-productive-nt productive-nt (cdr rules))])) + (define (iter productive-nt) + (let ([new-prod-nt (find-productive-nt productive-nt (grammar-rules g))]) + (if (equal? productive-nt new-prod-nt) + productive-nt + (iter new-prod-nt)))) + (iter null)) + +(define (cfg-reachable g) + (define (iter verts vis) + (cond + [(null? verts) vis] + [(member (car verts) vis) (iter (cdr verts) vis)] + [else (iter (cdr verts) (dfs (car verts) vis))])) + (define (dfs v vis) + (display v) + (newline) + (let* ([rules (filter (lambda (r) (eq? (car r) v)) (grammar-rules g))] + [verts (append-map (lambda (r) (cdr r)) rules)] + [verts (filter non-terminal? verts)] + [verts (map non-terminal-sym verts)]) + (iter verts (cons v vis)))) + (dfs (grammar-start g) null)) + +(define (cfg-optimize g) + (let* ([productive-nt (cfg-productive g)] + [productive-rules (filter (lambda (r) + (rule-productive? (cdr r) productive-nt)) + (grammar-rules g))] + [new-g (grammar (grammar-start g) productive-rules)] + [reachable-nt (cfg-reachable new-g)] + [res-g (grammar (grammar-start new-g) (filter + (lambda (r) (member (car r) reachable-nt)) + (grammar-rules new-g)))]) + res-g)) +
\ No newline at end of file diff --git a/Semestr 2/racket/egzamin/zad3a.rkt b/Semestr 2/racket/egzamin/zad3a.rkt new file mode 100644 index 0000000..eaa6645 --- /dev/null +++ b/Semestr 2/racket/egzamin/zad3a.rkt @@ -0,0 +1,301 @@ +#lang racket + +;; ZADANIE 3 +;; ========= + +;; Z gramatykami bezkontekstowymi spotkaliście się już na Wstępie do +;; Informatyki. W tym zadaniu potraktujemy je jako dane dla naszych +;; programów. + +;; Przypomnijmy, że gramatyka bezkontekstowa składa się z +;; · skończonego zbioru *symboli nieterminalnych* +;; · skończonego zbioru *symboli terminalnych* +;; · wybranego nieterminalnego symbolu startowego +;; · zbioru *produkcji*, czyli par symbol nieterminalny - lista +;; (potencjalnie pusta) symboli terminalnych lub nieterminalnych + +;; Słowo (ciąg symboli terminalnych) możemy wyprowadzić z gramatyki, +;; jeśli możemy zacząć od ciągu składającego się z symbolu startowego +;; możemy użyć skończonej liczby produkcji z gramatyki przepisując +;; symbol nieterminalny na ciąg symboli mu odpowiadających (w danej +;; produkcji). + + +;; Przykład: poprawne nawiasowania + +;; Gramatyka składa się z jednego symbolu nieterminalnego, S (który +;; jest oczywiście symbolem startowym) i dwóch symboli terminalnych +;; "(" i ")", i zawiera następujące produkcje (zwyczajowo zapisywane +;; przy użyciu strzałki; zwróćcie uwagę że pierwszy ciąg jest pusty!): +;; S -> +;; S -> SS +;; S -> (S) + +;; W często spotykanej, bardziej zwięzłej, postaci BNF moglibyśmy tę +;; gramatykę zapisać tak (dbając trochę bardziej o wizualne +;; oddzielenie symboli terminalnych i nieterminalnych): +;; S ::= "" | SS | "(" S ")" +;; Mamy tu te same produkcje, ale tylko raz zapisujemy każdą z +;; powtarzających się lewych stron. + +;; Z gramatyki tej da się wyprowadzić wszystkie poprawnie rozstawione +;; ciągi nawiasów — zobaczmy jak wyprowadzić (na jeden ze sposobów) +;; ciąg "(()())". Zaczynamy, jak zawsze, od słowa złożonego z symbolu +;; startowego i przepisujemy: +;; S -> (S) -> (SS) -> ((S)S) -> ((S)(S)) -> (()(S)) -> (()()) + + +;; Zadanie cz. 1 + +;; Zdefiniuj reprezentację gramatyki jako typu danych w +;; Rackecie. Warto zastanowić się co można uprościć względem definicji +;; matematycznej — w szczególności możemy założyć że dowolne napisy +;; (typu string) są ciągami symboli terminalnych, i że nie musimy +;; podawać jawnie zbioru nieterminali; również reprezentacja produkcji +;; gramatyki jako worka z parami wejście-wyjście niekoniecznie jest +;; najwygodniejsza. + +;; Uwaga: w tym zadaniu nie wymagamy definiowania składni konkretnej i +;; parsowania, ale bardzo polecamy wybranie jakiejś formy, żeby móc +;; sensownie przetestować swoje rozwiązanie! + + +;; "Optymalizacja" gramatyk + +;; Gramatyki, podobnie jak programy, piszą ludzie — może więc zdarzyć +;; się że znajdą się tam śmieci. Mogą one mieć dwojaką formę: symboli +;; nieterminalnych, których nie da się wyprowadzić z symbolu +;; startowego, lub symboli nieterminalnych z których nie da się +;; wyprowadzić żadnego słowa terminalnego (tj. niezawierającego +;; symboli nieterminalnych). Przykładowo, do naszej gramatyki +;; moglibyśmy dodać symbole P i Q, i produkcje: +;; S -> ")(" P +;; P -> PP "qed" +;; Q -> "abc" + +;; Mimo że nasza gramatyka wygląda inaczej na pierwszy rzut oka, tak +;; naprawdę się nie zmieniła: do symbolu Q nie możemy dojść z symbolu +;; S, a więc "abc" nigdy nie wystąpi w słowie wyprowadzalnym z +;; gramatyki. Analogicznie, z P nie da się wyprowadzić żadnego słowa, +;; które nie zawierałoby symbolu P — a zatem żadnego słowa złożonego +;; tylko z symboli terminalnych. To znaczy, że naszą gramatykę możemy +;; uprościć wyrzucając z niej symbole nieterminalne (i produkcje które +;; ich używają) do których nie da się dojść (tj. są *nieosiągalne*) i +;; te, z których nie da się ułożyć słowa terminalnego (tj. są +;; *nieproduktywne*). Jeśli z naszej rozszerzonej gramatyki wyrzucimy +;; takie symbole, dostaniemy oczywiście gramatykę początkową. + + +;; Zadanie cz. 2 + +;; Dla swojej reprezentacji gramatyki z poprzedniej części zadania +;; napisz dwie procedury: cfg-unreachable, znajdującą symbole +;; nieterminalne które są nieosiągalne z symbolu startowego, i +;; cfg-unproductive, znajdującą symbole nieterminalne które nie są +;; produktywne. Następnie użyj tych procedur żeby zdefiniować +;; procedurę cfg-optimize, która uprości daną gramatykę usuwając z +;; niej symbole nieosiągalne i nieproduktywne, a także odpowiednie +;; produkcje. + +;; Rozwiązanie wpisz w poniższym pliku, i opatrz komentarzem +;; opisującym wybraną reprezentację (i podjęte przy jej projektowaniu +;; decyzje), a także zaimplementowane w cz. 2. algorytmy. + + + + + + +;; Zadanie 1 + +;; Postanowiłem napisać parser, bo bez tego zadanie wydaje mi się dosyć ubogie +;; Składnia konkretna naszych gramatyk wygląda bardzo podobnie do zapisu +;; przedstawionego w treści zadania. +;; np. gramatyka nawiasowania będzie wyglądać następująco: +;; '(grammar S (S ::= "" -- SS -- "(" S ")")) +;; ale mogłaby wyglądać też tak: +;; '(grammar S (S ::= "") (S ::= SS -- "(" S ")")) +;; a np. ta nieciekawa gramatyka przedstawiona w treści zadania: +;; '(grammar S (S ::= "] [" P) (P ::= PP "qed") (Q ::= "abc")) +;; Zatem będzie to lista, która na pierwszym miejscu ma symbol 'grammar +;; na drugim miejscu ma symbol startowy +;; następnie następuje lista produkcji w formacie: +;; <non-terminal> ::= <lista produkcji, produkcje oddzielone są separatorem --> +;; Zalety: +;; - rozróżnienie w składni konkretnej symboli nieterminalnych i terminalnych +;; przez użycie symboli i stringów pozwala na to, aby symbole terminalne nazywały się tak +;; jak terminalne, tj. "S" nie jest tym samym co 'S. +;; - składnia wydaje się bardzo wygodna w użyciu, nie ma też problemu, żeby później dopisać +;; dodatkowe produkcje dla jednego symbolu nieterminalnego, np. (S ::= "") (S ::= SS) +;; - parser jest łatwy w implementacji +;; Wady: +;; - symbole nieterminalne mogą składać się jedynie z jednego symbolu, zatem nie możemy robić ich +;; zbyt wiele + +;; Reprezentacja gramatyki: podczas parsowania gramatyki symbole i stringi wewnątrz produkcji +;; reprezentowane są przez struktury terminal oraz non-terminal. Cała gramatyka to +;; struktura dwuelementowa - pierwszym jest symbol startowy, a drugim lista par <symbol . produkcja> +;; Taka decyzja właśnie pozwoliła na to, że zaproponowana przeze mnie składania konkretna jest +;; bardzo prosta do sparsowania - wystarczy każdą produkcję podzielić ze względu na separator '-- +;; i do czegoś podobnego do środowisk dodawać po prostu odpowiednie pary. +;; dla przykładu taka gramatyka: +;; '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QS -- "[" Q "]")) +;; będzie reprezentowana następująco: +;; (grammar +;; 'S +;; (production +;; (list +;; (list 'S (terminal "")) +;; (list 'S (non-terminal 'S) (non-terminal 'S)) +;; (list 'S (terminal "(") (non-terminal 'S) (terminal ")")) +;; (list 'S (non-terminal 'Q)) +;; (list 'Q (terminal "")) +;; (list 'Q (non-terminal 'Q) (non-terminal 'S)) +;; (list 'Q (terminal "[") (non-terminal 'Q) (terminal "]"))))) +;; Prosze zauważyć, że np. SS zostało zamienione na dwa sąsiednie nieterminalne symbole S +;; (to właśnie powód, dlaczego symbole nieterminalne mogą być jedynie jednoznakowe). + +;; Zdecydowałem się dodać strukturę production, bo wtedy łatwo można na niej operować +;; pisząc funkcje production-add, czy production-lookup itp. + + +(struct non-terminal (sym) #:transparent) +(struct terminal (sym) #:transparent) +(struct grammar (start rules) #:transparent) + +(define SEPARATOR '--) + +(define (make-cfg q) + (cond + [(and (list? q) (eq? 'grammar (first q))) + (grammar (second q) (append-map make-cfg (cddr q)))] + [(and (list? q) (eq? '::= (second q))) + (let ([nt (first q)] + [rules (split-by-separator (cddr q))]) + (map (lambda (x) (cons nt x)) (map make-rules rules)))] + [else (error "MAKE-CFG -- Parse error, unknown token" q)])) + +(define (make-cfg start rules) + (grammar start (make-rules rules))) + +(define (make-rules xs) + (cond + [(null? xs) null] + [(string? (car xs)) (cons (terminal (car xs)) (make-rules (cdr xs)))] + [(symbol? (car xs)) (append (map non-terminal (symbol->list (car xs))) (make-rules (cdr xs)))] + [else (error "Invalid syntax in production" xs)])) + +(define (split-at-symb symb xs) + (define (iter left right) + (cond + [(null? right) (cons left null)] + [(eq? symb (car right)) (cons left (cdr right))] + [else (iter (cons (car right) left) (cdr right))])) + (let ([res (iter null xs)]) + (cons (reverse (car res)) (cdr res)))) + +(define (split-by-separator xs) + (let ([res (split-at-symb SEPARATOR xs)]) + (if (null? (cdr res)) + res + (cons (car res) (split-by-separator (cdr res)))))) + +(define (symbol->list s) + (map string->symbol + (map string + (string->list (symbol->string s))))) + +(define sample '(S ::= "" -- SS -- "(" S ")")) +(define sample2 '(grammar S (S ::= "" -- SS -- "(" S ")" -- Q) (Q ::= "" -- QQ -- "[" Q "]"))) +(define sample3 '(grammar S + (S ::= A B -- D E) + (A ::= "a") + (B ::= "b" C) + (C ::= "c") + (D ::= "d" F) + (E ::= "e") + (F ::= "f" D))) + +;; zadanie 2 + +;; korzystam z algorytmów przedstawionych w tej książce: +;; https://bit.ly/3ev0NUA, konkretnie te ze stron 50-51 +;; Pozwoliłem sobie trochę zmienić przeznaczenie funkcji cfg-unreachable oraz cfg-unproductive +;; Zamiast zwracać nieproduktywne nieterminale, zwracają właśnie produktywne +;; i analogicznie w tym drugim. Po prostu taka implementacja jest dla mnie wygodniejsza, +;; a jest bardzo nieistotną zmianą koncepcyjną. +;; Stąd zmiana nazwy na cfg-productive oraz cfg-reachable + +;; cfg-productive działa w ten sposób: +;; Jakiś nieterminal nazywamy produktywnym, jeśli ma co najmniej jedną produktywną zasadę +;; Jakąś zasadę nazywamy produktywną, jeśli składa się z terminali oraz produktywnych nieterminali +;; Jasno widać, że wg tej definicji te nieterminale, które nie są produktywne, są nieproduktywne +;; wg definicji zadania, a cała reszta jest produktwna. + +;; Algorytm znajdowania produktywnych nieterminali: +;; Mamy listę produktywnych nieterminali P, początkowo pustą +;; 1. Stwórz nową listę P' +;; 2. Przejdź po liście produkcji +;; -> jeśli dana produkcja jest produktywna (wg P), dodaj jej nieterminal do P' +;; 3. Jeśli P != P', zrób P := P' i wróć do 1. +;; 4. Zwróć P + +;; Fajne w tym algorytmie jest to, że jeśli mamy jakiś nieterminal, którego +;; używamy w jakiejś produkcji, ale ten nieterminal nie ma zdefiniowanej swojej produkcji +;; to nie zostanie oznaczony jako produktywny, co jest dla nas korzystne + +;; Algorytm znajdowania osiągalnych nieterminali: +;; Traktujemy nitereminale jak wierzchołki w grafie a zasady jako listy sąsiedztwa. +;; Terminale są liśćmi, a nieterminale węzłami. Robimy po prostu DFSa z nieterminalu +;; startowego i węzły do których dotrzemy oznaczamy jako osiągalne. + +;; Wg papierka który tutaj podałem, jeśli najpierw usuniemy nieproduktywne nieterminale, +;; a w następnej kolejności nieosiągalne, to nasza gramatyka stanie się regularna. + +(define (productive? p productive-nt) + (or (terminal? p) (member (non-terminal-sym p) productive-nt))) +(define (rule-productive? r productive-nt) + (andmap (lambda (x) (productive? x productive-nt)) r)) + +(define (cfg-productive g) + (define (find-productive-nt productive-nt rules) + (cond + [(null? rules) (remove-duplicates productive-nt)] + [(rule-productive? (cdar rules) productive-nt) + (find-productive-nt (cons (caar rules) productive-nt) (cdr rules))] + [else (find-productive-nt productive-nt (cdr rules))])) + (define (iter productive-nt) + (let ([new-prod-nt (find-productive-nt productive-nt (grammar-rules g))]) + (if (equal? productive-nt new-prod-nt) + productive-nt + (iter new-prod-nt)))) + (iter null)) + +(define (cfg-reachable g) + (define (iter verts vis) + (cond + [(null? verts) vis] + [(member (car verts) vis) (iter (cdr verts) vis)] + [else (iter (cdr verts) (dfs (car verts) vis))])) + (define (dfs v vis) + (display v) + (newline) + (let* ([rules (filter (lambda (r) (eq? (car r) v)) (grammar-rules g))] + [verts (append-map (lambda (r) (cdr r)) rules)] + [verts (filter non-terminal? verts)] + [verts (map non-terminal-sym verts)]) + (iter verts (cons v vis)))) + (dfs (grammar-start g) null)) + +(define (cfg-optimize g) + (let* ([productive-nt (cfg-productive g)] + [productive-rules (filter (lambda (r) + (rule-productive? (cdr r) productive-nt)) + (grammar-rules g))] + [new-g (grammar (grammar-start g) productive-rules)] + [reachable-nt (cfg-reachable new-g)] + [res-g (grammar (grammar-start new-g) (filter + (lambda (r) (member (car r) reachable-nt)) + (grammar-rules new-g)))]) + res-g)) +
\ No newline at end of file diff --git a/Semestr 2/racket/l10z18/solution.bak b/Semestr 2/racket/l10z18/solution.bak new file mode 100644 index 0000000..02eb770 --- /dev/null +++ b/Semestr 2/racket/l10z18/solution.bak @@ -0,0 +1,363 @@ +#lang racket + +;; Składnia abstrakcyjna +(struct const (val) #:transparent) +(struct var-expr (name) #:transparent) +(struct let-expr (id bound body) #:transparent) +(struct letrec-expr (id bound body) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct lambda-expr (arg body) #:transparent) +(struct app-expr (fun arg) #:transparent) + +(define (keyword s) + (member s '(true false null and or if cond else lambda let letrec))) + +(define (expr? e) + (match e + [(const n) (or (number? n) + (boolean? n) + (null? n) + (string? n))] + [(var-expr id) (symbol? id)] + [(let-expr x e1 e2 ) (and (symbol? x) + (expr? e1) + (expr? e2))] + [(letrec-expr x e1 e2) (and (symbol? x) + (expr? e1) + (expr? e2))] + [(if-expr eb et ef) (and (expr? eb) + (expr? et) + (expr? ef))] + [(lambda-expr x e) (and (symbol? x) + (expr? e))] + [(app-expr ef ea) (and (expr? ef) + (expr? ea))] + [_ false])) + +;; Parsowanie (zacytowane wyrażenie -> składnia abstrakcyjna) +(define (parse q) + (cond + [(number? q) (const q)] + [(string? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (const null)] + [(and (symbol? q) + (not (keyword q))) + (var-expr q)] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'let) + (list? (second q)) + (= (length (second q)) 2) + (symbol? (first (second q)))) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'letrec) + (list? (second q)) + (= (length (second q)) 2) + (symbol? (first (second q)))) + (letrec-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) + (pair? q) + (eq? (first q) 'and)) + (desugar-and (map parse (cdr q)))] + [(and (list? q) + (pair? q) + (eq? (first q) 'or)) + (desugar-or (map parse (cdr q)))] + [(and (list? q) + (>= (length q) 2) + (eq? (first q) 'cond)) + (parse-cond (cdr q))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'lambda) + (list? (second q)) + (andmap symbol? (second q)) + (cons? (second q))) + (desugar-lambda (second q) (parse (third q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-app (parse (first q)) (map parse (cdr q)))] + [else (error "Unrecognized token:" q)])) + +(define (parse-cond qs) + (match qs + [(list (list 'else q)) + (parse q)] + + [(list (list q _)) + (error "Expected 'else' in last branch but found:" q)] + + [(cons (list qb qt) qs) + (if-expr (parse qb) (parse qt) (parse-cond qs))])) + +(define (desugar-and es) + (if (null? es) + (const true) + (if-expr (car es) (desugar-and (cdr es)) (const false)))) + +(define (desugar-or es) + (if (null? es) + (const false) + (if-expr (car es) (const true) (desugar-or (cdr es))))) + +(define (desugar-lambda xs e) + (if (null? xs) + e + (lambda-expr (car xs) (desugar-lambda (cdr xs) e)))) + +(define (desugar-app e es) + (if (null? es) + e + (desugar-app (app-expr e (car es)) (cdr es)))) + +;; Środowiska +(struct blackhole ()) +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (mcons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) + (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (let ((v (mcdr (car xs)))) + (if (blackhole? v) + (error "Jumped into blackhole at" x) + v))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) +(define (env-update! x v env) + (define (assoc-update xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (set-mcdr! (car xs) v)] + [else (assoc-update (cdr xs))])) + (assoc-update (environ-xs env))) + +;; Domknięcia +(struct clo (arg body env)) + +;; Procedury wbudowane, gdzie +;; proc — Racketowa procedura którą należy uruchomić +;; args — lista dotychczas dostarczonych argumentów +;; pnum — liczba brakujących argumentów (> 0) +;; W ten sposób pozwalamy na częściową aplikację Racketowych procedur +;; — zauważmy że zawsze znamy pnum, bo w naszym języku arność +;; procedury jest ustalona z góry +(struct builtin (proc args pnum) #:transparent) + +;; Pomocnicze konstruktory procedur unarnych i binarnych +(define (builtin/1 p) + (builtin (lambda (x) (return (p x))) null 1)) +(define (builtin/2 p) + (builtin (lambda (x y) (return (p x y))) null 2)) + +;; Procedury +(define (proc? v) + (or (and (clo? v) + (symbol? (clo-arg v)) + (expr? (clo-body v)) + (environ? (clo-env v))) + (and (builtin? v) + (procedure? (builtin-proc v)) + (andmap value? (builtin-args v)) + (natural? (builtin-pnum v)) + (> (builtin-pnum v) 0)))) + +;; Definicja typu wartości +(define (value? v) + (or (number? v) + (boolean? v) + (null? v) + (string? v) + (and (cons? v) + (value? (car v)) + (value? (cdr v))) + (proc? v))) + +;; Środowisko początkowe (przypisujące procedury wbudowane ich nazwom) + +(define start-env + (foldl (lambda (p env) (env-add (first p) (second p) env)) + env-empty + `((+ ,(builtin/2 +)) + (- ,(builtin/2 -)) + (* ,(builtin/2 *)) + (/ ,(builtin/2 /)) + (~ ,(builtin/1 -)) + (< ,(builtin/2 <)) + (> ,(builtin/2 >)) + (= ,(builtin/2 =)) + (<= ,(builtin/2 <=)) + (>= ,(builtin/2 >=)) + (not ,(builtin/1 not)) + (cons ,(builtin/2 cons)) + (car ,(builtin/1 car)) + (cdr ,(builtin/1 cdr)) + (pair? ,(builtin/1 cons?)) + (null? ,(builtin/1 null?)) + (boolean? ,(builtin/1 boolean?)) + (number? ,(builtin/1 number?)) + (procedure? ,(builtin/1 (lambda (x) (or (clo? x) (builtin? x))))) + (string? ,(builtin/1 string?)) + (string-= ,(builtin/2 string=?)) + ;; and so on, and so on + ))) + +;; Efekt + +(define (effect-builtin/1 p) + (builtin p null 1)) +(define (effect-builtin/2 p) + (builtin p null 2)) + +(define effect-env + (foldl (lambda (p env) (env-add (first p) (second p) env)) + start-env + `((choose ,(effect-builtin/2 (lambda (x y) (list x y)))) + ))) + +(define (bind c k) (append-map k c)) + +(define (return x) (list x)) + +;; Ewaluator +(define (eval-env e env) + (match e + [(const n) + (return n)] + + [(var-expr x) + (return (env-lookup x env))] + + [(let-expr x e1 e2) + (bind (eval-env e1 env) (lambda (v1) + (eval-env e2 (env-add x v1 env))))] + + [(letrec-expr f ef eb) + (let ((new-env (env-add f (blackhole) env))) + (bind (eval-env ef new-env) (lambda (vf) + (env-update! f vf new-env) + (eval-env eb new-env))))] + + [(if-expr eb et ef) + (bind (eval-env eb env) (lambda (vb) + (match vb + [#t (eval-env et env)] + [#f (eval-env ef env)] + [v (error "Not a boolean:" v)])))] + + [(lambda-expr x e) + (return (clo x e env))] + + [(app-expr ef ea) + (bind (eval-env ef env) (lambda (vf) + (bind (eval-env ea env) (lambda (va) + (match vf + [(clo x e env) + (eval-env e (env-add x va env))] + [(builtin p args nm) + (if (= nm 1) + (apply p (reverse (cons va args))) + (return (builtin p (cons va args) (- nm 1))))] + [_ (error "Not a function:" vf)])))))])) + +(define (eval e) + (eval-env e effect-env)) + + +;; Przykladowy program + +(define PROGRAM + '((if (choose true false) (lambda (x) x) (lambda (x) (+ x 1))) (choose 1 2))) + + +;; REPL — interpreter interaktywny (read-eval-print loop) + +;; dodajemy składnię na wiązanie zmiennych "na poziomie interpretera" +;; i komendę wyjścia "exit" ... +(struct letrec-repl (id expr)) +(struct let-repl (id expr)) +(struct exit-repl ()) + +;; ... a także rozszerzoną procedurę parsującą te dodatkowe komendy i +;; prostą obsługę błędów +(define (parse-repl q) + (with-handlers + ([exn? (lambda (exn) + (display "Parse error! ") + (displayln (exn-message exn)))]) + (cond + [(eq? q 'exit) (exit-repl)] + [(and (list? q) + (= 3 (length q)) + (eq? (first q) 'let)) + (let-repl (second q) (parse (third q)))] + [(and (list? q) + (= 3 (length q)) + (eq? (first q) 'letrec)) + (letrec-repl (second q) (parse (third q)))] + [else (parse q)]))) + +;; trochę zamieszania w procedurze eval-repl wynika z rudymentarnej +;; obsługi błędów: nie chcemy żeby błąd w interpretowanym programie +;; kończył działanie całego interpretera! +(define (eval-repl c env continue) + (define (eval-with-err e env) + (with-handlers + ([exn? (lambda (exn) + (display "Error! ") + (displayln (exn-message exn)))]) + (eval-env e env))) + (match c + [(exit-repl) + (void)] + + [(let-repl x e) + (let ((v (eval-with-err e env))) + (if (void? v) + (continue env) + (continue (env-add x v env))))] + + [(letrec-repl f e) + (let* ((new-env (env-add f (blackhole) env)) + (v (eval-with-err e new-env))) + (if (void? v) + (continue env) + (begin + (env-update! f v new-env) + (continue new-env))))] + + [_ + (let ((v (eval-with-err c env))) + (unless (void? v) + (displayln v)) + (continue env))])) + +;; I w końcu interaktywny interpreter +(define (repl) + (define (go env) + (display "FUN > ") + (let* ((q (read)) + (c (parse-repl q))) + (if (void? c) + (go env) + (eval-repl c env go)))) + (displayln "Welcome to the FUN functional language interpreter!") + (go start-env))
\ No newline at end of file diff --git a/Semestr 2/racket/l10z18/solution.rkt b/Semestr 2/racket/l10z18/solution.rkt new file mode 100644 index 0000000..7adcea4 --- /dev/null +++ b/Semestr 2/racket/l10z18/solution.rkt @@ -0,0 +1,409 @@ +#lang racket + +;; Składnia abstrakcyjna +(struct const (val) #:transparent) +(struct var-expr (name) #:transparent) +(struct let-expr (id bound body) #:transparent) +(struct letrec-expr (id bound body) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct lambda-expr (arg body) #:transparent) +(struct app-expr (fun arg) #:transparent) + +(provide parse eval norm) + +(define (keyword s) + (member s '(true false null and or if cond else lambda let letrec))) + +(define (expr? e) + (match e + [(const n) (or (number? n) + (boolean? n) + (null? n) + (string? n))] + [(var-expr id) (symbol? id)] + [(let-expr x e1 e2 ) (and (symbol? x) + (expr? e1) + (expr? e2))] + [(letrec-expr x e1 e2) (and (symbol? x) + (expr? e1) + (expr? e2))] + [(if-expr eb et ef) (and (expr? eb) + (expr? et) + (expr? ef))] + [(lambda-expr x e) (and (symbol? x) + (expr? e))] + [(app-expr ef ea) (and (expr? ef) + (expr? ea))] + [_ false])) + +;; Parsowanie (zacytowane wyrażenie -> składnia abstrakcyjna) +(define (parse q) + (cond + [(number? q) (const q)] + [(string? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (const null)] + [(and (symbol? q) + (not (keyword q))) + (var-expr q)] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'let) + (list? (second q)) + (= (length (second q)) 2) + (symbol? (first (second q)))) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'letrec) + (list? (second q)) + (= (length (second q)) 2) + (symbol? (first (second q)))) + (letrec-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) + (= (length q) 4) + (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) + (pair? q) + (eq? (first q) 'and)) + (desugar-and (map parse (cdr q)))] + [(and (list? q) + (pair? q) + (eq? (first q) 'or)) + (desugar-or (map parse (cdr q)))] + [(and (list? q) + (>= (length q) 2) + (eq? (first q) 'cond)) + (parse-cond (cdr q))] + [(and (list? q) + (= (length q) 3) + (eq? (first q) 'lambda) + (list? (second q)) + (andmap symbol? (second q)) + (cons? (second q))) + (desugar-lambda (second q) (parse (third q)))] + [(and (list? q) + (>= (length q) 2)) + (desugar-app (parse (first q)) (map parse (cdr q)))] + [else (error "Unrecognized token:" q)])) + +(define (parse-cond qs) + (match qs + [(list (list 'else q)) + (parse q)] + + [(list (list q _)) + (error "Expected 'else' in last branch but found:" q)] + + [(cons (list qb qt) qs) + (if-expr (parse qb) (parse qt) (parse-cond qs))])) + +(define (desugar-and es) + (if (null? es) + (const true) + (if-expr (car es) (desugar-and (cdr es)) (const false)))) + +(define (desugar-or es) + (if (null? es) + (const false) + (if-expr (car es) (const true) (desugar-or (cdr es))))) + +(define (desugar-lambda xs e) + (if (null? xs) + e + (lambda-expr (car xs) (desugar-lambda (cdr xs) e)))) + +(define (desugar-app e es) + (if (null? es) + e + (desugar-app (app-expr e (car es)) (cdr es)))) + +;; Środowiska +(struct blackhole ()) +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (mcons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) + (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (let ((v (mcdr (car xs)))) + (if (blackhole? v) + (error "Jumped into blackhole at" x) + v))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) +(define (env-update! x v env) + (define (assoc-update xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (mcar (car xs))) + (set-mcdr! (car xs) v)] + [else (assoc-update (cdr xs))])) + (assoc-update (environ-xs env))) + +;; Domknięcia +(struct clo (arg body env)) + +;; Procedury wbudowane, gdzie +;; proc — Racketowa procedura którą należy uruchomić +;; args — lista dotychczas dostarczonych argumentów +;; pnum — liczba brakujących argumentów (> 0) +;; W ten sposób pozwalamy na częściową aplikację Racketowych procedur +;; — zauważmy że zawsze znamy pnum, bo w naszym języku arność +;; procedury jest ustalona z góry +(struct builtin (proc args pnum) #:transparent) + +;; Pomocnicze konstruktory procedur unarnych i binarnych +(define (builtin/1 p) + (builtin (lambda (x) (return (p x))) null 1)) +(define (builtin/2 p) + (builtin (lambda (x y) (return (p x y))) null 2)) + +;; Procedury +(define (proc? v) + (or (and (clo? v) + (symbol? (clo-arg v)) + (expr? (clo-body v)) + (environ? (clo-env v))) + (and (builtin? v) + (procedure? (builtin-proc v)) + (andmap value? (builtin-args v)) + (natural? (builtin-pnum v)) + (> (builtin-pnum v) 0)))) + +;; Definicja typu wartości +(define (value? v) + (or (number? v) + (boolean? v) + (null? v) + (string? v) + (and (cons? v) + (value? (car v)) + (value? (cdr v))) + (proc? v))) + +;; Środowisko początkowe (przypisujące procedury wbudowane ich nazwom) + +(define start-env + (foldl (lambda (p env) (env-add (first p) (second p) env)) + env-empty + `((+ ,(builtin/2 +)) + (- ,(builtin/2 -)) + (* ,(builtin/2 *)) + (/ ,(builtin/2 /)) + (~ ,(builtin/1 -)) + (< ,(builtin/2 <)) + (> ,(builtin/2 >)) + (= ,(builtin/2 =)) + (<= ,(builtin/2 <=)) + (>= ,(builtin/2 >=)) + (not ,(builtin/1 not)) + (cons ,(builtin/2 cons)) + (car ,(builtin/1 car)) + (cdr ,(builtin/1 cdr)) + (pair? ,(builtin/1 cons?)) + (null? ,(builtin/1 null?)) + (boolean? ,(builtin/1 boolean?)) + (number? ,(builtin/1 number?)) + (procedure? ,(builtin/1 (lambda (x) (or (clo? x) (builtin? x))))) + (string? ,(builtin/1 string?)) + (string-= ,(builtin/2 string=?)) + ;; and so on, and so on + ))) + +;; Efekt + +(define (effect-builtin/1 p) + (builtin p null 1)) +(define (effect-builtin/2 p) + (builtin p null 2)) +(define (effect-builtin/3 p) + (builtin p null 3)) + + +(define effect-env + (foldl (lambda (p env) (env-add (first p) (second p) env)) + start-env + `((flip ,(effect-builtin/3 (lambda (p x y) (list (cons p x) (cons (- 1 p) y))))) + (uniform ,(effect-builtin/1 (lambda (x) (let ((l (/ 1 (length x)))) + (map (lambda (x) (cons l x)) x))))) + ))) + +;; c to lista par (pstwo, wartość) +;; k to funkcja która przyjmuje wartość i coś z nią robi sobie i zwraca listę par (pstwo, wartość) + +(define (bind c k) + (append-map + (lambda (x) (let ((pstwo (car x)) + (val (cdr x))) + (map + (lambda (x) (cons (* pstwo (car x)) (cdr x))) + (k (cdr x))))) + c)) + +(define (return x) (list (cons 1 x))) + +;; Ewaluator +(define (eval-env e env) + (match e + [(const n) + (return n)] + + [(var-expr x) + (return (env-lookup x env))] + + [(let-expr x e1 e2) + (bind (eval-env e1 env) (lambda (v1) + (eval-env e2 (env-add x v1 env))))] + + [(letrec-expr f ef eb) + (let ((new-env (env-add f (blackhole) env))) + (bind (eval-env ef new-env) (lambda (vf) + (env-update! f vf new-env) + (eval-env eb new-env))))] + + [(if-expr eb et ef) + (bind (eval-env eb env) (lambda (vb) + (match vb + [#t (eval-env et env)] + [#f (eval-env ef env)] + [v (error "Not a boolean:" v)])))] + + [(lambda-expr x e) + (return (clo x e env))] + + [(app-expr ef ea) + (bind (eval-env ef env) (lambda (vf) + (bind (eval-env ea env) (lambda (va) + (match vf + [(clo x e env) + (eval-env e (env-add x va env))] + [(builtin p args nm) + (if (= nm 1) + (apply p (reverse (cons va args))) + (return (builtin p (cons va args) (- nm 1))))] + [_ (error "Not a function:" vf)])))))])) + +(define (eval e) + (eval-env e effect-env)) + + +;; Przykladowy program + +(define PROGRAM + '((if (choose true false) (lambda (x) x) (lambda (x) (+ x 1))) (choose 1 2))) + + +;; REPL — interpreter interaktywny (read-eval-print loop) + +;; dodajemy składnię na wiązanie zmiennych "na poziomie interpretera" +;; i komendę wyjścia "exit" ... +(struct letrec-repl (id expr)) +(struct let-repl (id expr)) +(struct exit-repl ()) + +;; ... a także rozszerzoną procedurę parsującą te dodatkowe komendy i +;; prostą obsługę błędów +(define (parse-repl q) + (with-handlers + ([exn? (lambda (exn) + (display "Parse error! ") + (displayln (exn-message exn)))]) + (cond + [(eq? q 'exit) (exit-repl)] + [(and (list? q) + (= 3 (length q)) + (eq? (first q) 'let)) + (let-repl (second q) (parse (third q)))] + [(and (list? q) + (= 3 (length q)) + (eq? (first q) 'letrec)) + (letrec-repl (second q) (parse (third q)))] + [else (parse q)]))) + +;; trochę zamieszania w procedurze eval-repl wynika z rudymentarnej +;; obsługi błędów: nie chcemy żeby błąd w interpretowanym programie +;; kończył działanie całego interpretera! +(define (eval-repl c env continue) + (define (eval-with-err e env) + (with-handlers + ([exn? (lambda (exn) + (display "Error! ") + (displayln (exn-message exn)))]) + (eval-env e env))) + (match c + [(exit-repl) + (void)] + + [(let-repl x e) + (let ((v (eval-with-err e env))) + (if (void? v) + (continue env) + (continue (env-add x v env))))] + + [(letrec-repl f e) + (let* ((new-env (env-add f (blackhole) env)) + (v (eval-with-err e new-env))) + (if (void? v) + (continue env) + (begin + (env-update! f v new-env) + (continue new-env))))] + + [_ + (let ((v (eval-with-err c env))) + (unless (void? v) + (displayln v)) + (continue env))])) + +;; I w końcu interaktywny interpreter +(define (repl) + (define (go env) + (display "FUN > ") + (let* ((q (read)) + (c (parse-repl q))) + (if (void? c) + (go env) + (eval-repl c env go)))) + (displayln "Welcome to the FUN functional language interpreter!") + (go start-env)) + + +(define prog '(if (flip 0.3 true false) "wygrana" "przegrana")) + + +(define (norm xs) + (define sum (lambda (xs) (foldl + 0 xs))) + (define carlist (lambda (xs) (map car xs))) + (define (iter xs res) + (cond + [(null? xs) res] + [(member (cdar xs) (map cdr res)) (iter (cdr xs) res)] + [else (let* ((cur (cdar xs)) + (pstwa (filter (lambda (x) (equal? (cdr x) cur)) xs))) + (iter (cdr xs) (cons (cons (sum (carlist pstwa)) cur) res)))])) + (iter xs null)) + + +(define DICE-MANY + '(letrec [from-to (lambda (x n) + (cons x + (if (= x n) + null + (from-to (+ 1 x) n))))] + (let [dice (lambda (x) (uniform (from-to 1 6)))] + (letrec [dice-many (lambda (n) (if (= n 0) + 0 + (+ (dice 0) (dice-many (- n 1)))))] + (dice-many (dice 0))))))
\ No newline at end of file diff --git a/Semestr 2/racket/l11/rozw.bak b/Semestr 2/racket/l11/rozw.bak new file mode 100644 index 0000000..cda82ce --- /dev/null +++ b/Semestr 2/racket/l11/rozw.bak @@ -0,0 +1,2 @@ +#lang racket + diff --git a/Semestr 2/racket/l11/rozw.rkt b/Semestr 2/racket/l11/rozw.rkt new file mode 100644 index 0000000..e45e403 --- /dev/null +++ b/Semestr 2/racket/l11/rozw.rkt @@ -0,0 +1,776 @@ +#reader(lib"read.ss""wxme")WXME0109 ## +#| + This file uses the GRacket editor format. + Open this file in DrRacket version 7.6 or later to read it. + + Most likely, it was created by saving a program in DrRacket, + and it probably contains a program with non-text elements + (such as images or comment boxes). + + http://racket-lang.org/ +|# + 33 7 #"wxtext\0" +3 1 6 #"wxtab\0" +1 1 8 #"wximage\0" +2 0 8 #"wxmedia\0" +4 1 34 #"(lib \"syntax-browser.ss\" \"mrlib\")\0" +1 0 36 #"(lib \"cache-image-snip.ss\" \"mrlib\")\0" +1 0 68 +(0 + #"((lib \"image-core.ss\" \"mrlib\") (lib \"image-core-wxme.rkt\" \"mr" + #"lib\"))\0" +) 1 0 16 #"drscheme:number\0" +3 0 44 #"(lib \"number-snip.ss\" \"drscheme\" \"private\")\0" +1 0 36 #"(lib \"comment-snip.ss\" \"framework\")\0" +1 0 93 +(1 + #"((lib \"collapsed-snipclass.ss\" \"framework\") (lib \"collapsed-sni" + #"pclass-wxme.ss\" \"framework\"))\0" +) 0 0 43 #"(lib \"collapsed-snipclass.ss\" \"framework\")\0" +0 0 19 #"drscheme:sexp-snip\0" +0 0 29 #"drscheme:bindings-snipclass%\0" +1 0 101 +(2 + #"((lib \"ellipsis-snip.rkt\" \"drracket\" \"private\") (lib \"ellipsi" + #"s-snip-wxme.rkt\" \"drracket\" \"private\"))\0" +) 2 0 88 +(3 + #"((lib \"pict-snip.rkt\" \"drracket\" \"private\") (lib \"pict-snip.r" + #"kt\" \"drracket\" \"private\"))\0" +) 0 0 55 +#"((lib \"snip.rkt\" \"pict\") (lib \"snip-wxme.rkt\" \"pict\"))\0" +1 0 34 #"(lib \"bullet-snip.rkt\" \"browser\")\0" +0 0 25 #"(lib \"matrix.ss\" \"htdp\")\0" +1 0 22 #"drscheme:lambda-snip%\0" +1 0 29 #"drclickable-string-snipclass\0" +0 0 26 #"drracket:spacer-snipclass\0" +0 0 57 +#"(lib \"hrule-snip.rkt\" \"macro-debugger\" \"syntax-browser\")\0" +1 0 26 #"drscheme:pict-value-snip%\0" +0 0 45 #"(lib \"image-snipr.ss\" \"slideshow\" \"private\")\0" +1 0 38 #"(lib \"pict-snipclass.ss\" \"slideshow\")\0" +2 0 55 #"(lib \"vertical-separator-snip.ss\" \"stepper\" \"private\")\0" +1 0 18 #"drscheme:xml-snip\0" +1 0 31 #"(lib \"xml-snipclass.ss\" \"xml\")\0" +1 0 21 #"drscheme:scheme-snip\0" +2 0 34 #"(lib \"scheme-snipclass.ss\" \"xml\")\0" +1 0 10 #"text-box%\0" +1 0 32 #"(lib \"text-snipclass.ss\" \"xml\")\0" +1 0 1 6 #"wxloc\0" + 0 0 81 0 1 #"\0" +0 75 1 #"\0" +0 10 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 0 9 +#"Standard\0" +0 75 12 #"Courier New\0" +0 16 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 -1 -1 2 24 +#"framework:default-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 15 +#"text:ports out\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 34 119 34 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1 +-1 2 15 #"text:ports err\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 17 +#"text:ports value\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 +-1 2 27 #"Matching Parenthesis Style\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 +-1 2 1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 37 +#"framework:syntax-color:scheme:symbol\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +38 #"framework:syntax-color:scheme:keyword\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 +38 #"framework:syntax-color:scheme:comment\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 204 221 170 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 37 +#"framework:syntax-color:scheme:string\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +35 #"framework:syntax-color:scheme:text\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +39 #"framework:syntax-color:scheme:constant\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 49 +#"framework:syntax-color:scheme:hash-colon-keyword\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +42 #"framework:syntax-color:scheme:parenthesis\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 178 178 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36 +#"framework:syntax-color:scheme:error\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 36 +#"framework:syntax-color:scheme:other\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 144 179 255 0 0 0 -1 -1 2 +16 #"Misspelled Text\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 +38 #"drracket:check-syntax:lexically-bound\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 50 163 255 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 28 +#"drracket:check-syntax:set!d\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2 +37 #"drracket:check-syntax:unused-require\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2 +36 #"drracket:check-syntax:free-variable\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 204 204 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 31 +#"drracket:check-syntax:imported\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 166 0 255 0 0 0 -1 -1 2 47 +#"drracket:check-syntax:my-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 192 203 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 50 +#"drracket:check-syntax:their-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 50 205 50 0 0 0 -1 -1 2 48 +#"drracket:check-syntax:unk-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 +49 #"drracket:check-syntax:both-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 240 230 140 0 0 0 -1 -1 2 +26 #"plt:htdp:test-coverage-on\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 2 27 +#"plt:htdp:test-coverage-off\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 205 92 92 0 0 0 -1 -1 4 1 +#"\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 4 4 #"XML\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 2 37 #"plt:module-language:test-coverage-on\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 2 +38 #"plt:module-language:test-coverage-off\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 205 92 92 0 0 0 -1 -1 0 36 +#"mrlib/syntax-browser:subtitle-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 100 149 237 0 0 0 -1 -1 0 +42 #"mrlib/syntax-browser:focused-syntax-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 50 205 50 0 0 0 -1 -1 4 1 +#"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 4 1 #"\0" +0 -1 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 191 255 0 0 0 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 191 255 0 0 0 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 152 251 152 0 0 0 +-1 -1 4 32 #"widget.rkt::browser-text% basic\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 4 59 +#"macro-debugger/syntax-browser/properties color-text% basic\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 58 1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 190 190 190 0 0 0 -1 -1 2 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 200 0 0 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 255 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 255 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 185 220 113 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 155 255 155 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 116 116 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 18 67 155 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 30 70 190 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 75 135 185 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 176 208 208 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 116 116 255 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 200 125 255 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 143 15 223 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 165 0 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 141 19 5 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 244 194 71 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 255 255 127 0 0 0 -1 -1 4 +1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 86 86 86 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 255 255 255 0 31 31 -1 -1 +4 1 #"\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 255 255 0 -1 -1 + 0 475 0 28 3 12 #"#lang racket" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 7 #"require" +0 0 24 3 1 #" " +0 0 14 3 15 #"racket/contract" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 17 3 13 #";;; Zadanie 1" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 8 #"suffixes" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 3 #") (" +0 0 14 3 6 #"listof" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 5 #")))) " +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 2 #"if" +0 0 24 3 2 #" (" +0 0 14 3 5 #"null?" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 6 #" " +0 0 14 3 4 #"null" +0 0 24 29 1 #"\n" +0 0 24 3 7 #" (" +0 0 14 3 4 #"cons" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 2 #" (" +0 0 14 3 8 #"suffixes" +0 0 24 3 2 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 5 #")))))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 17 3 13 #";;; Zadanie 2" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 8 #"sublists" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 3 #") (" +0 0 14 3 6 #"listof" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 6 #")))) " +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 2 #"if" +0 0 24 3 2 #" (" +0 0 14 3 5 #"null?" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 7 #" (" +0 0 14 3 4 #"list" +0 0 24 3 1 #" " +0 0 14 3 4 #"null" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 7 #" (" +0 0 14 3 10 #"append-map" +0 0 24 29 1 #"\n" +0 0 24 3 8 #" (" +0 0 15 3 6 #"lambda" +0 0 24 3 2 #" (" +0 0 14 3 2 #"ys" +0 0 24 3 3 #") (" +0 0 14 3 4 #"list" +0 0 24 3 2 #" (" +0 0 14 3 4 #"cons" +0 0 24 3 2 #" (" +0 0 14 3 3 #"car" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 2 #") " +0 0 14 3 2 #"ys" +0 0 24 3 2 #") " +0 0 14 3 2 #"ys" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 8 #" (" +0 0 14 3 8 #"sublists" +0 0 24 3 2 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 5 #")))))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 17 3 13 #";;; Zadanie 3" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 17 #"autistic-identity" +0 0 24 3 1 #" " +0 0 14 3 1 #"x" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 2 #" " +0 0 14 3 1 #"x" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 6 #"create" +0 0 24 3 1 #" " +0 0 14 3 4 #"comb" +0 0 24 3 1 #" " +0 0 14 3 4 #"next" +0 0 24 3 1 #" " +0 0 14 3 3 #"beg" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 3 #") (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 2 #") " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 4 #" ((" +0 0 14 3 4 #"comb" +0 0 24 3 2 #" (" +0 0 14 3 4 #"next" +0 0 24 3 1 #" " +0 0 14 3 3 #"beg" +0 0 24 3 2 #") " +0 0 14 3 3 #"beg" +0 0 24 3 3 #")))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 7 #"compose" +0 0 24 3 1 #" " +0 0 14 3 2 #"bc" +0 0 24 3 1 #" " +0 0 14 3 2 #"ab" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 3 #") (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 3 #") (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"c" +0 0 24 3 3 #")))" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 15 3 6 #"lambda" +0 0 24 3 2 #" (" +0 0 14 3 1 #"x" +0 0 24 3 3 #") (" +0 0 14 3 2 #"bc" +0 0 24 3 2 #" (" +0 0 14 3 2 #"ab" +0 0 24 3 1 #" " +0 0 14 3 1 #"x" +0 0 24 3 4 #"))))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 5 #"ident" +0 0 24 3 1 #" " +0 0 14 3 1 #"f" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 2 #") " +0 0 14 3 1 #"a" +0 0 24 3 2 #") " +0 0 14 3 1 #"a" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 1 #"f" +0 0 24 3 1 #" " +0 0 14 3 8 #"identity" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 17 3 13 #";;; Zadanie 4" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 12 #"broken-contr" +0 0 24 3 1 #" " +0 0 14 3 1 #"x" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 1 #"b" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 12 #"broken-contr" +0 0 24 3 1 #" " +0 0 14 3 1 #"x" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 17 3 13 #";;; Zadanie 5" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 15 #"define/contract" +0 0 24 3 2 #" (" +0 0 14 3 9 #"foldl-map" +0 0 24 3 1 #" " +0 0 14 3 1 #"f" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 14 #"parametric->/c" +0 0 24 3 2 #" [" +0 0 14 3 1 #"F" +0 0 24 3 1 #" " +0 0 14 3 1 #"A" +0 0 24 3 1 #" " +0 0 14 3 1 #"L" +0 0 24 3 3 #"] (" +0 0 14 3 2 #"->" +0 0 24 3 2 #" (" +0 0 14 3 2 #"->" +0 0 24 3 1 #" " +0 0 14 3 1 #"L" +0 0 24 3 1 #" " +0 0 14 3 1 #"A" +0 0 24 3 2 #" (" +0 0 14 3 6 #"cons/c" +0 0 24 3 1 #" " +0 0 14 3 1 #"F" +0 0 24 3 1 #" " +0 0 14 3 1 #"A" +0 0 24 3 3 #")) " +0 0 14 3 1 #"A" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"L" +0 0 24 3 3 #") (" +0 0 14 3 6 #"cons/c" +0 0 24 3 2 #" (" +0 0 14 3 6 #"listof" +0 0 24 3 1 #" " +0 0 14 3 1 #"F" +0 0 24 3 2 #") " +0 0 14 3 1 #"A" +0 0 24 3 4 #"))) " +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 15 3 6 #"define" +0 0 24 3 2 #" (" +0 0 14 3 2 #"it" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #" " +0 0 14 3 2 #"ys" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 5 #" (" +0 0 14 3 2 #"if" +0 0 24 3 2 #" (" +0 0 14 3 5 #"null?" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 14 3 4 #"cons" +0 0 24 3 2 #" (" +0 0 14 3 7 #"reverse" +0 0 24 3 1 #" " +0 0 14 3 2 #"ys" +0 0 24 3 2 #") " +0 0 14 3 1 #"a" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 15 3 3 #"let" +0 0 24 3 3 #" [(" +0 0 14 3 1 #"p" +0 0 24 3 2 #" (" +0 0 14 3 1 #"f" +0 0 24 3 2 #" (" +0 0 14 3 3 #"car" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 2 #") " +0 0 14 3 1 #"a" +0 0 24 3 3 #"))]" +0 0 24 29 1 #"\n" +0 0 24 3 11 #" (" +0 0 14 3 2 #"it" +0 0 24 3 2 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 1 #"p" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 15 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 15 #" (" +0 0 14 3 4 #"cons" +0 0 24 3 2 #" (" +0 0 14 3 3 #"car" +0 0 24 3 1 #" " +0 0 14 3 1 #"p" +0 0 24 3 2 #") " +0 0 14 3 2 #"ys" +0 0 24 3 5 #")))))" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 2 #"it" +0 0 24 3 1 #" " +0 0 14 3 1 #"a" +0 0 24 3 1 #" " +0 0 14 3 2 #"xs" +0 0 24 3 1 #" " +0 0 14 3 4 #"null" +0 0 24 3 2 #"))" +0 0 diff --git a/Semestr 2/racket/l11/solution.bak b/Semestr 2/racket/l11/solution.bak new file mode 100644 index 0000000..3ae167a --- /dev/null +++ b/Semestr 2/racket/l11/solution.bak @@ -0,0 +1,18 @@ +#lang racket + +(require racket/contract) + +(provide (contract-out [square square/c])) +(provide square/c) + +(define square/c (-> number? (not/c negative?))) + +(define (square x) (* x x)) + + +(define with-labels/c (parametric->/c [a b] (-> (-> a b)) + +(define (with-labels f xs) + (if (null? xs) + null + (cons (list (f (car xs)) (car xs)) (with-labels f (cdr xs)))))
\ No newline at end of file diff --git a/Semestr 2/racket/l11/solution.rkt b/Semestr 2/racket/l11/solution.rkt new file mode 100644 index 0000000..55e4ba6 --- /dev/null +++ b/Semestr 2/racket/l11/solution.rkt @@ -0,0 +1,35 @@ +#lang racket + +(provide (contract-out + [with-labels with-labels/c] + [foldr-map foldr-map/c] + [pair-from pair-from/c])) +(provide with-labels/c foldr-map/c pair-from/c) + + +(define with-labels/c (parametric->/c [a b] (-> (-> a b) (listof a) (listof (cons/c b (cons/c a null?)))))) + +(define (with-labels f xs) + (if (null? xs) + null + (cons (list (f (car xs)) (car xs)) (with-labels f (cdr xs))))) + + + +(define foldr-map/c (parametric->/c [x a f] (-> (-> x a (cons/c f a)) a (listof x) (cons/c (listof f) a)))) + +(define (foldr-map f a xs) + (define (it a xs ys) + (if (null? xs) + (cons ys a) + (let [(p (f (car xs) a))] + (it (cdr p) + (cdr xs) + (cons (car p) ys))))) + (it a (reverse xs) null)) + + +(define pair-from/c (parametric->/c [x fx gx] (-> (-> x fx) (-> x gx) (-> x (cons/c fx gx))))) + +(define (pair-from f g) + (lambda (x) (cons (f x) (g x))))
\ No newline at end of file diff --git a/Semestr 2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep b/Semestr 2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep new file mode 100644 index 0000000..6d38ce0 --- /dev/null +++ b/Semestr 2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.dep @@ -0,0 +1 @@ +("7.6" racket ("b51d3a36a64d34c7978bfc22f2a5fe674cee1cb6" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/Semestr 2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zo b/Semestr 2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zo Binary files differnew file mode 100644 index 0000000..ef91f9a --- /dev/null +++ b/Semestr 2/racket/l11z20/compiled/drracket/errortrace/graph_rkt.zo diff --git a/Semestr 2/racket/l11z20/graph.bak b/Semestr 2/racket/l11z20/graph.bak new file mode 100644 index 0000000..9f4d79d --- /dev/null +++ b/Semestr 2/racket/l11z20/graph.bak @@ -0,0 +1,97 @@ +#lang racket + +(provide bag^ graph^ simple-graph@ graph-search^ graph-search@) + +;; sygnatura dla struktury danych +(define-signature bag^ + ((contracted + [bag? (-> any/c boolean?)] + [empty-bag (and/c bag? bag-empty?)] + [bag-empty? (-> bag? boolean?)] + [bag-insert (-> bag? any/c (and/c bag? (not/c bag-empty?)))] + [bag-peek (-> (and/c bag? (not/c bag-empty?)) any/c)] + [bag-remove (-> (and/c bag? (not/c bag-empty?)) bag?)]))) + +;; sygnatura: grafy +(define-signature graph^ + ((contracted + [graph (-> list? (listof edge?) graph?)] + [graph? (-> any/c boolean?)] + [graph-nodes (-> graph? list?)] + [graph-edges (-> graph? (listof edge?))] + [edge (-> any/c any/c edge?)] + [edge? (-> any/c boolean?)] + [edge-start (-> edge? any/c)] + [edge-end (-> edge? any/c)] + [has-node? (-> graph? any/c boolean?)] + [outnodes (-> graph? any/c list?)] + [remove-node (-> graph? any/c graph?)] + ))) + +;; prosta implementacja grafów +(define-unit simple-graph@ + (import) + (export graph^) + + (define (graph? g) + (and (list? g) + (eq? (length g) 3) + (eq? (car g) 'graph))) + + (define (edge? e) + (and (list? e) + (eq? (length e) 3) + (eq? (car e) 'edge))) + + (define (graph-nodes g) (cadr g)) + + (define (graph-edges g) (caddr g)) + + (define (graph n e) (list 'graph n e)) + + (define (edge n1 n2) (list 'edge n1 n2)) + + (define (edge-start e) (cadr e)) + + (define (edge-end e) (caddr e)) + + (define (has-node? g n) (not (not (member n (graph-nodes g))))) + + (define (outnodes g n) + (filter-map + (lambda (e) + (and (eq? (edge-start e) n) + (edge-end e))) + (graph-edges g))) + + (define (remove-node g n) + (graph + (remove n (graph-nodes g)) + (filter + (lambda (e) + (not (eq? (edge-start e) n))) + (graph-edges g))))) + +;; sygnatura dla przeszukiwania grafu +(define-signature graph-search^ + (search)) + +;; implementacja przeszukiwania grafu +;; uzależniona od implementacji grafu i struktury danych +(define-unit graph-search@ + (import bag^ graph^) + (export graph-search^) + (define (search g n) + (define (it g b l) + (cond + [(bag-empty? b) (reverse l)] + [(has-node? g (bag-peek b)) + (it (remove-node g (bag-peek b)) + (foldl + (lambda (n1 b1) (bag-insert b1 n1)) + (bag-remove b) + (outnodes g (bag-peek b))) + (cons (bag-peek b) l))] + [else (it g (bag-remove b) l)])) + (it g (bag-insert empty-bag n) '())) + ) diff --git a/Semestr 2/racket/l11z20/graph.rkt b/Semestr 2/racket/l11z20/graph.rkt new file mode 100644 index 0000000..ec19576 --- /dev/null +++ b/Semestr 2/racket/l11z20/graph.rkt @@ -0,0 +1,100 @@ +#lang racket + +(provide bag^ graph^ simple-graph@ graph-search^ graph-search@) + +;; sygnatura dla struktury danych +(define-signature bag^ + ((contracted + [bag? (-> any/c boolean?)] + [empty-bag (and/c bag? bag-empty?)] + [bag-empty? (-> bag? boolean?)] + [bag-insert (-> bag? any/c (and/c bag? (not/c bag-empty?)))] + [bag-peek (-> (and/c bag? (not/c bag-empty?)) any/c)] + [bag-remove (-> (and/c bag? (not/c bag-empty?)) bag?)]))) + +;; sygnatura: grafy +(define-signature graph^ + ((contracted + [graph (-> list? (listof edge?) graph?)] + [graph? (-> any/c boolean?)] + [graph-nodes (-> graph? list?)] + [graph-edges (-> graph? (listof edge?))] + [edge (-> any/c any/c edge?)] + [edge? (-> any/c boolean?)] + [edge-start (-> edge? any/c)] + [edge-end (-> edge? any/c)] + [has-node? (-> graph? any/c boolean?)] + [outnodes (-> graph? any/c list?)] + [remove-node (-> graph? any/c graph?)] + ))) + +;; prosta implementacja grafów +(define-unit simple-graph@ + (import) + (export graph^) + + (define (graph? g) + (and (list? g) + (eq? (length g) 3) + (eq? (car g) 'graph))) + + (define (edge? e) + (and (list? e) + (eq? (length e) 3) + (eq? (car e) 'edge))) + + (define (graph-nodes g) (cadr g)) + + (define (graph-edges g) (caddr g)) + + (define (graph n e) (list 'graph n e)) + + (define (edge n1 n2) (list 'edge n1 n2)) + + (define (edge-start e) (cadr e)) + + (define (edge-end e) (caddr e)) + + (define (has-node? g n) (not (not (member n (graph-nodes g))))) + + (define (outnodes g n) + (filter-map + (lambda (e) + (and (eq? (edge-start e) n) + (edge-end e))) + (graph-edges g))) + + (define (remove-node g n) + (graph + (remove n (graph-nodes g)) + (filter + (lambda (e) + (not (eq? (edge-start e) n))) + (graph-edges g))))) + +;; sygnatura dla przeszukiwania grafu +(define-signature graph-search^ + (search)) + +;; implementacja przeszukiwania grafu +;; uzależniona od implementacji grafu i struktury danych +(define-unit graph-search@ + (import bag^ graph^) + (export graph-search^) + (define (search g n) + (define (it g b l) + (cond + [(bag-empty? b) (reverse l)] + [(has-node? g (bag-peek b)) + (it (remove-node g (bag-peek b)) + (foldl + (lambda (n1 b1) (bag-insert b1 n1)) + (bag-remove b) + (outnodes g (bag-peek b))) + (cons (bag-peek b) l))] + [else (it g (bag-remove b) l)])) + (it g (bag-insert empty-bag n) '())) + ) + +;; otwarcie komponentu grafu +(define-values/invoke-unit/infer simple-graph@)
\ No newline at end of file diff --git a/Semestr 2/racket/l11z20/solution.bak b/Semestr 2/racket/l11z20/solution.bak new file mode 100644 index 0000000..6f1f7b4 --- /dev/null +++ b/Semestr 2/racket/l11z20/solution.bak @@ -0,0 +1 @@ +#lang racket diff --git a/Semestr 2/racket/l11z20/solution.rkt b/Semestr 2/racket/l11z20/solution.rkt new file mode 100644 index 0000000..e3ad81f --- /dev/null +++ b/Semestr 2/racket/l11z20/solution.rkt @@ -0,0 +1,245 @@ +#lang racket + +(require "graph.rkt") +(provide bag-stack@ bag-fifo@) + +;; struktura danych - stos +(define-unit bag-stack@ + (import) + (export bag^) + + (define (bag? b) + (and (cons? b) + (eq? (car b) 'stack))) + + (define empty-bag (cons 'stack null)) + + (define (bag-empty? b) + (null? (cdr b))) + + (define (bag-insert b val) + (cons 'stack (cons val (cdr b)))) + + (define (bag-peek b) + (cadr b)) + + (define (bag-remove b) + (cons 'stack (cddr b))) +) + +;; struktura danych - kolejka FIFO +(define-unit bag-fifo@ + (import) + (export bag^) + + (define (bag? b) + (and (list? b) + (eq? (length b) 3) + (eq? (first b) 'queue))) + + (define empty-bag + (list 'queue null null)) + + (define (bag-empty? b) + (and (null? (second b)) (null? (third b)))) + + (define (bag-insert b val) + (list 'queue (cons val (second b)) (third b))) + + (define (bag-peek b) + (let ((insq (second b)) + (popq (third b))) + (cond + [(null? popq) (last insq)] + [else (first popq)]))) + + (define (bag-remove b) + (let ((insq (second b)) + (popq (third b))) + (cond + [(null? popq) (list 'queue null (cdr (reverse insq)))] + [else (list 'queue insq (cdr popq))]))) +) + +;; otwarcie komponentów stosu i kolejki + +(define-values/invoke-unit bag-stack@ + (import) + (export (prefix stack: bag^))) + +(define-values/invoke-unit bag-fifo@ + (import) + (export (prefix fifo: bag^))) + +;; testy w Quickchecku +(require quickcheck) + +;; liczba zapytań na test quickchecka +(define TESTS 1000) + + +;; TESTY DO KOLEJKI + +;; xs to lista jakichś liczb, queries to rodzaj wykonywanych operacji +;; 0 - popuje na listę pops +;; 1 - insertuje na queue +;; jest nie ma nic na kolejce/stosie i dostajemy 0, to nic nie robimy +;; jesli queries albo xs są puste to po prostu kończymy obsługiwanie zapytań +;; na koncu sprawdzamy, czy (reverse pops) jest prefiksem xs + + +(define (check-queue xs queries) + (define (iter xs queries queue pops) + ;; (display queue) + ;; (newline) + (if (or (null? queries) (null? xs)) + (reverse pops) + (cond + [(and (eq? (car queries) 0) (not (fifo:bag-empty? queue))) + (iter xs (cdr queries) (fifo:bag-remove queue) (cons (fifo:bag-peek queue) pops))] + [else (iter (cdr xs) (cdr queries) (fifo:bag-insert queue (car xs)) pops)]))) + (define (is-prefix? xs ys) + (if (null? xs) + #t + (and (equal? (car xs) (car ys)) (is-prefix? (cdr xs) (cdr ys))))) + (is-prefix? (iter xs queries fifo:empty-bag null) xs)) + +;; sprawdzenie czy nasza funkcja testująca w ogóle działa +(define check-queue-test (lambda () (check-queue (list 1 2 3 4 5 6 7 8) (list 0 1 1 1 0 0 0 1 1 0 1 0 1 0 0)))) + +;; testowanie kolejki +(define-unit queue-tests@ + (import bag^) + (export) + + (quickcheck + (property ([xs (choose-list (choose-real -100000 100000) TESTS)] + [ops (choose-list (choose-integer 0 1) TESTS)]) + (check-queue xs ops)))) + +(invoke-unit queue-tests@ (import (prefix fifo: bag^))) + + +;; TESTY DO STOSU + +;; niestety tutaj nie jest tak kolorowo, na kolejce +;; dokładnie wiemy jaka jest koljeność popowanych, na stosie to dosyć dowolne. +;; Z drugiej strony jego implementacja jest dużo prostsza, więc testy też nie muszą +;; być bardzo rygorystyczne. + +(define (check-stack xs) + (define (insert-list stack xs) + (if (null? xs) + stack + (insert-list (stack:bag-insert stack (car xs)) (cdr xs)))) + (define (clear-stack stack pops) + (if (stack:bag-empty? stack) + pops + (clear-stack (stack:bag-remove stack) (cons (stack:bag-peek stack) pops)))) + (equal? xs (clear-stack (insert-list stack:empty-bag xs) null))) + + +;; testowanie stacka +(define-unit stack-tests@ + (import bag^) + (export) + (quickcheck + (property ([xs (choose-list (choose-real -100000 100000) TESTS)]) + (check-stack xs)))) + +(invoke-unit stack-tests@ (import (prefix stack: bag^))) + + + +;; testy kolejek i stosów +(define-unit bag-tests@ + (import bag^) + (export) + + ;; test przykładowy: jeśli do pustej struktury dodamy element + ;; i od razu go usuniemy, wynikowa struktura jest pusta + (quickcheck + (property ([s arbitrary-symbol]) + (bag-empty? (bag-remove (bag-insert empty-bag s))))) + + ;; Sprawdzenie własności wspólnych dla obu struktur + (quickcheck + (property ([s arbitrary-symbol]) + (equal? s (bag-peek (bag-insert empty-bag s))))) +) + +;; uruchomienie testów dla obu struktur danych + +(invoke-unit bag-tests@ (import (prefix stack: bag^))) +(invoke-unit bag-tests@ (import (prefix fifo: bag^))) + + + +;; TESTOWANIE PRZESZUKIWAŃ + +;; otwarcie komponentu grafu +(define-values/invoke-unit/infer simple-graph@) + +;; otwarcie komponentów przeszukiwania +;; w głąb i wszerz +(define-values/invoke-unit graph-search@ + (import graph^ (prefix stack: bag^)) + (export (prefix dfs: graph-search^))) + +(define-values/invoke-unit graph-search@ + (import graph^ (prefix fifo: bag^)) + (export (prefix bfs: graph-search^))) + +;; graf testowy +(define test-graph + (graph + (list 1 2 3 4) + (list (edge 1 3) + (edge 1 2) + (edge 2 4)))) + +(define test-graph2 + (graph (list 1) null)) + +(define test-graph3 + (graph (list 1 2 3 4 5 6 7 8 9 10) + (list (edge 1 2) + (edge 1 3) + (edge 2 3) + (edge 3 2) + (edge 3 5) + (edge 6 5) + (edge 5 7) + (edge 5 8) + (edge 7 9) + (edge 8 9) + (edge 9 10) + (edge 1 10) + (edge 10 1)))) + + +(define test-graph4 + (graph (list 1 2 3 4 5 6) + (list (edge 1 2) + (edge 2 3) + (edge 3 4) + (edge 4 5) + (edge 5 6)))) + +;; uruchomienie przeszukiwania na przykładowym grafie +(bfs:search test-graph 1) +(dfs:search test-graph 1) + +(bfs:search test-graph2 1) +(dfs:search test-graph2 1) + +(bfs:search test-graph3 1) +(dfs:search test-graph3 1) + +(bfs:search test-graph3 6) +(dfs:search test-graph3 6) + +(bfs:search test-graph4 1) +(dfs:search test-graph4 1) + + diff --git a/Semestr 2/racket/l13/oceny.txt b/Semestr 2/racket/l13/oceny.txt new file mode 100644 index 0000000..9f17cad --- /dev/null +++ b/Semestr 2/racket/l13/oceny.txt @@ -0,0 +1,18 @@ +1 sem
+
+MDM - 5 5
+AO - 5
+AM 1 - 5 5
+LDI - 5 5
+MIA - 5
+
+8 * 5
+
+
+2 sem
+
+Topologia - 5 3
+Analiza - 4 4
+MP - 5 5
+PPS - 5
+Algebra - 5 5
\ No newline at end of file diff --git a/Semestr 2/racket/l13/rozw.rkt b/Semestr 2/racket/l13/rozw.rkt new file mode 100644 index 0000000..b4094db --- /dev/null +++ b/Semestr 2/racket/l13/rozw.rkt @@ -0,0 +1,79 @@ +#lang typed/racket
+
+
+;;; zadanie 1
+
+(: prefixes (All (a) (-> (Listof a) (Listof (Listof a)))))
+(define (prefixes xs)
+ (if (null? xs)
+ (list null)
+ (cons xs (prefixes (cdr xs)))))
+
+
+
+;;; zadanie 2
+
+(struct vector2 ([x : Real] [y : Real]) #:transparent)
+(struct vector3 ([x : Real] [y : Real] [z : Real]) #:transparent)
+
+(define-type Vector (U vector2 vector3))
+(define-predicate vector? Vector)
+
+
+(: square (-> Real Nonnegative-Real))
+(define (square x)
+ (if (< x 0) (* x x) (* x x)))
+
+
+;;; pierwsza wersja
+
+(: vector-length (-> Vector Nonnegative-Real))
+(define (vector-length v)
+ (if (vector2? v)
+ (match v [(vector2 x y) (sqrt (+ (square x) (square y)))])
+ (match v [(vector3 x y z) (sqrt (+ (square x) (square y) (square z)))])))
+
+
+;;; druga wersja
+
+(: vector-length-match (-> Vector Nonnegative-Real))
+(define (vector-length-match v)
+ (match v
+ [(vector2 x y) (sqrt (+ (square x) (square y)))]
+ [(vector3 x y z) (sqrt (+ (square x) (square y) (square z)))]))
+
+
+
+;;; zadanie 4
+
+(struct leaf () #:transparent)
+(struct [a] node ([v : a] [xs : (Listof (Tree a))]) #:transparent)
+
+(define-type (Tree a) (node a))
+(define-predicate tree? (Tree Any))
+
+
+(: flat-map (All (a) (-> (-> (Tree a) (Listof a)) (Listof (Tree a)) (Listof a))))
+(define (flat-map f xs)
+ (if (null? xs)
+ null
+ (append (f (car xs)) (flat-map f (cdr xs)))))
+
+(: preorder (All (a) (-> (Tree a) (Listof a))))
+(define (preorder t)
+ (match t
+ [(node v xs)
+ (cons v (flat-map preorder xs))]))
+
+;;; (preorder (node 1 (list
+;;; (node 2 (list
+;;; (node 3 '())
+;;; (node 4 '())))
+;;; (node 5 '())
+;;; (node 'x (list
+;;; (node 't (list
+;;; (node 'z '()))))))))
+
+
+;;; zadanie 6
+
diff --git a/Semestr 2/racket/l13/solution.rkt b/Semestr 2/racket/l13/solution.rkt new file mode 100644 index 0000000..61804b3 --- /dev/null +++ b/Semestr 2/racket/l13/solution.rkt @@ -0,0 +1,124 @@ +#lang typed/racket
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(provide parse typecheck)
+
+(define-type Expr (U const binop var-expr let-expr if-expr))
+(define-type Value (U Real Boolean))
+(define-type ArithOp (U '+ '- '/ '* '%))
+;;; (define-type ModOp '%)
+(define-type CompOp (U '= '> '>= '< '<=))
+(define-type LogicOp (U 'and 'or))
+(define-type BinopSym (U ArithOp CompOp LogicOp))
+
+(struct const ([val : Value]) #:transparent)
+(struct binop ([op : BinopSym] [l : Expr] [r : Expr]) #:transparent)
+(struct var-expr ([id : Symbol]) #:transparent)
+(struct let-expr ([id : Symbol] [e1 : Expr] [e2 : Expr]) #:transparent)
+(struct if-expr ([eb : Expr] [et : Expr] [ef : Expr]) #:transparent)
+
+(define-predicate expr? Expr)
+(define-predicate value? Value)
+(define-predicate arith-op? ArithOp)
+;;; (define-predicate mod-op? ModOp)
+(define-predicate comp-op? CompOp)
+(define-predicate logic-op? LogicOp)
+(define-predicate binop-sym? BinopSym)
+(define-predicate let-list? (List Symbol Any))
+
+(: parse (-> Any Expr))
+(define (parse q)
+ (match q
+ [_ #:when (value? q) (const q)]
+ [_ #:when (eq? q 'true) (const true)]
+ [_ #:when (eq? q 'false) (const false)] ; <---------------------------- !!!
+ [_ #:when (symbol? q) (var-expr q)]
+ [`(,s ,e1 ,e2)
+ #:when (and (eq? s 'let) (let-list? e1))
+ (let-expr (car e1)
+ (parse (cadr e1))
+ (parse e2))]
+ [`(,s ,eb ,et ,ef)
+ #:when (eq? s 'if)
+ (if-expr (parse eb)
+ (parse et)
+ (parse ef))]
+ [`(,s ,e1 ,e2)
+ #:when (binop-sym? s)
+ (binop s
+ (parse e1)
+ (parse e2))]
+ [else (error "Parse error" q)]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(define-type EType (U 'real 'boolean))
+(define-predicate EType? EType)
+
+(struct environ ([xs : (Listof (Pairof Symbol EType))]))
+(define env-empty (environ null))
+
+(: env-add (-> Symbol EType environ environ))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+
+(: env-lookup (-> Symbol environ EType))
+(define (env-lookup x env)
+ (: assoc-lookup (-> (Listof (Pairof Symbol EType)) EType))
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+(: check-op (-> Expr Expr EType EType environ (U EType #f)))
+(define (check-op e1 e2 arg-type ret-type env)
+ (if (and (eq? (typecheck-env e1 env) arg-type)
+ (eq? (typecheck-env e2 env) arg-type))
+ ret-type
+ #f))
+
+(: typecheck-env (-> Expr environ (U EType #f)))
+(define (typecheck-env e env)
+ (match e
+ [(const val)
+ (cond
+ [(real? val) 'real]
+ [(boolean? val) 'boolean])]
+ [(var-expr id) (env-lookup id env)]
+ [(binop op e1 e2)
+ (cond
+ [(arith-op? op) (check-op e1 e2 'real 'real env)]
+ [(comp-op? op) (check-op e1 e2 'real 'boolean env)]
+ [(logic-op? op) (check-op e1 e2 'boolean 'boolean env)])]
+ [(let-expr id e1 e2)
+ (let ((id-type (typecheck-env e1 env)))
+ (if id-type
+ (typecheck-env e2 (env-add id id-type env))
+ #f))]
+ [(if-expr eb et ef)
+ (let ((eb-type (typecheck-env eb env)))
+ (if (not (eq? eb-type 'boolean))
+ #f
+ (let ((et-type (typecheck-env et env))
+ (ef-type (typecheck-env ef env)))
+ (if (eq? et-type ef-type) ;;; nie trzeba sprawdzac czy ktores z nich to #f
+ et-type ;;; jesli tak jest, to i tak sie na pewno zwroci #f
+ #f))))]))
+
+(: typecheck (-> Expr (U EType #f)))
+(define (typecheck e)
+ (typecheck-env e env-empty))
+
+(define program
+ '(if (or (< (% 123 10) 5)
+ true)
+ (+ 2 3)
+ (/ 2 0)))
+
+(define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/l13/zad6.rkt b/Semestr 2/racket/l13/zad6.rkt new file mode 100644 index 0000000..1dcfbfc --- /dev/null +++ b/Semestr 2/racket/l13/zad6.rkt @@ -0,0 +1,132 @@ +#lang typed/racket
+
+; Do let-env.rkt dodajemy wartosci boolowskie
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(define-type Expr (U const binop var-expr let-expr if-expr))
+(define-type Value (U Real Boolean))
+(define-type BinopSym (U '+ '- '/ '* '% '= '> '>= '< '<= 'and 'or))
+
+(struct const ([val : Value]) #:transparent)
+(struct binop ([op : BinopSym] [l : Expr] [r : Expr]) #:transparent)
+(struct var-expr ([id : Symbol]) #:transparent)
+(struct let-expr ([id : Symbol] [e1 : Expr] [e2 : Expr]) #:transparent)
+(struct if-expr ([eb : Expr] [et : Expr] [ef : Expr]) #:transparent)
+
+
+(define-predicate expr? Expr)
+(define-predicate value? Value)
+(define-predicate binop-sym? BinopSym)
+(define-predicate let-list? (List Symbol Any))
+
+(: parse (-> Any Expr))
+(define (parse q)
+ (match q
+ [_ #:when (value? q) (const q)]
+ [_ #:when (eq? q 'true) (const true)]
+ [_ #:when (eq? q 'false) (const false)] ; <---------------------------- !!!
+ [_ #:when (symbol? q) (var-expr q)]
+ [`(,s ,e1 ,e2)
+ #:when (and (eq? s 'let) (let-list? e1))
+ (let-expr (car e1)
+ (parse (cadr e1))
+ (parse e2))]
+ [`(,s ,eb ,et ,ef)
+ #:when (eq? s 'if)
+ (if-expr (parse eb)
+ (parse et)
+ (parse ef))]
+ [`(,s ,e1 ,e2)
+ #:when (binop-sym? s)
+ (binop s
+ (parse e1)
+ (parse e2))]
+ [else (error "Parse error" q)]))
+
+;;; (define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1))))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ ([xs : (Listof (Pairof Symbol Value))]))
+(define env-empty (environ null))
+
+(: env-add (-> Symbol Value environ environ))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+
+(: env-lookup (-> Symbol environ Value))
+(define (env-lookup x env)
+ (: assoc-lookup (-> (Listof (Pairof Symbol Value)) Value))
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(: arith-op (-> (-> Real Real Real) (-> Value Value Value)))
+(define (arith-op op)
+ (lambda (x y) (if (and (real? x) (real? y))
+ (ann (op x y) Value)
+ (error "Wrong args for arithmetic operator" op x y))))
+
+(: mod-op (-> (-> Integer Integer Integer) (-> Value Value Value)))
+(define (mod-op op)
+ (lambda (x y) (if (and (exact-integer? x) (exact-integer? y))
+ (ann (op x y) Value)
+ (error "Wrong args for modulo operator" op x y))))
+
+(: logic-op (-> (-> Boolean Boolean Boolean) (-> Value Value Value)))
+(define (logic-op op)
+ (lambda (x y) (if (and (boolean? x) (boolean? y))
+ (ann (op x y) Value)
+ (error "Wrong args for logic operator" op x y))))
+
+(: comp-op (-> (-> Real Real Boolean) (-> Value Value Value)))
+(define (comp-op op)
+ (lambda (x y) (if (and (real? x) (real? y))
+ (ann (op x y) Value)
+ (error "Wrong args for comparator" op x y))))
+
+
+(: op->proc (-> BinopSym (-> Value Value Value)))
+(define (op->proc op)
+ (match op ['+ (arith-op +)] ['- (arith-op -)] ['* (arith-op *)] ['/ (arith-op /)]
+ ['% (mod-op modulo)]
+ ['= (comp-op =)] ['> (comp-op >)] ['>= (comp-op >=)] ['< (comp-op <)] ['<= (comp-op <=)]
+ ['and (logic-op (lambda (x y) (and x y)))]
+ ['or (logic-op (lambda (x y) (or x y)))]))
+
+(: eval-env (-> Expr environ Value))
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!!
+ (eval-env et env)
+ (eval-env ef env))]))
+
+(: eval (-> Expr Value))
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(if (or (< (% 123 10) 5)
+ true)
+ (+ 2 3)
+ (/ 2 0)))
+
+;;; (define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/l14z22/solution.bak b/Semestr 2/racket/l14z22/solution.bak new file mode 100644 index 0000000..0d4f164 --- /dev/null +++ b/Semestr 2/racket/l14z22/solution.bak @@ -0,0 +1,70 @@ +#lang racket + +(require racklog) + +(provide solve) + +;; transpozycja tablicy zakodowanej jako lista list +(define (transpose xss) + (cond [(null? xss) xss] + ((null? (car xss)) (transpose (cdr xss))) + [else (cons (map car xss) + (transpose (map cdr xss)))])) + +;; procedura pomocnicza +;; tworzy listę n-elementową zawierającą wyniki n-krotnego +;; wywołania procedury f +(define (repeat-fn n f) + (if (eq? 0 n) null + (cons (f) (repeat-fn (- n 1) f)))) + +;; tworzy tablicę n na m elementów, zawierającą świeże +;; zmienne logiczne +(define (make-rect n m) + (repeat-fn m (lambda () (repeat-fn n _)))) + +;; predykat binarny +;; (%row-ok xs ys) oznacza, że xs opisuje wiersz (lub kolumnę) ys +(define %row-ok + (%rel () +;; TODO: uzupełnij! + )) + +;; TODO: napisz potrzebne ci pomocnicze predykaty + +;; funkcja rozwiązująca zagadkę +(define (solve rows cols) + (define board (make-rect (length cols) (length rows))) + (define tboard (transpose board)) + (define ret (%which (xss) + (%= xss board) +;; TODO: uzupełnij! + )) + (and ret (cdar ret))) + +;; testy +(equal? (solve '((2) (1) (1)) '((1 1) (2))) + '((* *) + (_ *) + (* _))) + +(equal? (solve '((2) (2 1) (1 1) (2)) '((2) (2 1) (1 1) (2))) + '((_ * * _) + (* * _ *) + (* _ _ *) + (_ * * _))) + +(equal? (solve '((4) (6) (2 2) (2 2) (6) (4) (2) (2) (2)) + '((9) (9) (2 2) (2 2) (4) (4))) + '((* * * * _ _) + (* * * * * *) + (* * _ _ * *) + (* * _ _ * *) + (* * * * * *) + (* * * * _ _) + (* * _ _ _ _) + (* * _ _ _ _) + (* * _ _ _ _))) + +;; TODO: możesz dodać własne testy + diff --git a/Semestr 2/racket/l14z22/solution.rkt b/Semestr 2/racket/l14z22/solution.rkt new file mode 100644 index 0000000..480c772 --- /dev/null +++ b/Semestr 2/racket/l14z22/solution.rkt @@ -0,0 +1,87 @@ +#lang racket + +(require racklog) + +(provide solve) + +;; transpozycja tablicy zakodowanej jako lista list +(define (transpose xss) + (cond [(null? xss) xss] + ((null? (car xss)) (transpose (cdr xss))) + [else (cons (map car xss) + (transpose (map cdr xss)))])) + +;; procedura pomocnicza +;; tworzy listę n-elementową zawierającą wyniki n-krotnego +;; wywołania procedury f +(define (repeat-fn n f) + (if (eq? 0 n) null + (cons (f) (repeat-fn (- n 1) f)))) + +;; tworzy tablicę n na m elementów, zawierającą świeże +;; zmienne logiczne +(define (make-rect n m) + (repeat-fn m (lambda () (repeat-fn n _)))) + +;; predykat binarny +;; (%row-ok xs ys) oznacza, że xs opisuje wiersz (lub kolumnę) ys +(define %row-ok + (%rel (xs ys zs n) + [(null null)] + [(xs (cons '_ ys)) + (%row-ok xs ys)] + [((cons n xs) ys) + (%stars ys n) + (%cut-first-n ys zs n) + (%row-ok xs zs)])) + + +(define %suffix + (%rel (xs ys x) + [(xs xs)] + [((cons x xs) ys) + (%suffix xs ys)])) + +(define %cut-first-n + (%rel (xs ys n yl) + [(xs xs 0)] + [(xs ys n) + (%suffix xs ys) + (%is #t (= (- (length xs) (length ys)) n))])) + + +;; usun n pierwszych elementow z xs +(define (suffix xs n) + (if (= n 0) + xs + (suffix (cdr xs) (- n 1)))) + + +;; sprawdza czy pierwsze n elementów listy to gwiazdki (dokladnie n) +(define %stars + (%rel (xs m n) + [(null 0)] + [((cons '_ xs) n) + (%is n 0)] + [((cons '* xs) n) + (%is m (- n 1)) + (%stars xs m)])) + +(define %board-ok + (%rel (xss xs yss ys) + [(null null)] + [((cons xs xss) (cons ys yss)) + (%row-ok xs ys) + (%board-ok xss yss)])) + +;; funkcja rozwiązująca zagadkę +(define (solve rows cols) + (define board (make-rect (length cols) (length rows))) + (define tboard (transpose board)) + (define ret (%which (xss) + (%= xss board) + (%board-ok rows board) + (%board-ok cols tboard))) + (and ret (cdar ret))) + + diff --git a/Semestr 2/racket/l15/kacp.bak b/Semestr 2/racket/l15/kacp.bak new file mode 100644 index 0000000..ff2a2bc --- /dev/null +++ b/Semestr 2/racket/l15/kacp.bak @@ -0,0 +1,55 @@ +#lang racket + +(define (run-concurrent . thunks) + (define threads (map thread thunks)) + (for-each thread-wait threads)) + +(define (random-sleep) + (sleep (/ (random) 100))) + +(define (with-random-sleep proc) + (lambda args + (random-sleep) + (apply proc args))) + +(define (make-serializer) + (define sem (make-semaphore 1)) + (lambda (proc) + (lambda args + (semaphore-wait sem) + (define ret (apply proc args)) + (semaphore-post sem) + ret))) + +(define (table) + (random-sleep) + (define forks (list (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1))) + (define (pick-fork i) + (random-sleep) + (semaphore-wait (list-ref forks i))) + (define (put-fork i) + (random-sleep) + (semaphore-post (list-ref forks i))) + (define (dispatch m) + (cond [(eq? m 'pick-fork) pick-fork] + [(eq? m 'put-fork) put-fork] + [else (error "Unknown request -- TABLE" + m)])) + dispatch) + +(define dtable (table)) + +(define (philosopher dining-table number) + (define my-turn (make-serializer)) + (define (eat) + (display number) + (newline) + ((dining-table 'pick-fork) number) + ((dining-table 'put-fork) number) + ((dining-table 'pick-fork) (modulo (+ number 1) 5)) + ((dining-table 'put-fork) (modulo (+ number 1) 5))) + (my-turn eat))
\ No newline at end of file diff --git a/Semestr 2/racket/l15/kacp.rkt b/Semestr 2/racket/l15/kacp.rkt new file mode 100644 index 0000000..bd484f1 --- /dev/null +++ b/Semestr 2/racket/l15/kacp.rkt @@ -0,0 +1,59 @@ +#lang racket + +(define (run-concurrent . thunks) + (define threads (map thread thunks)) + (for-each thread-wait threads)) + +(define (random-sleep) + (sleep (/ (random) 100))) + +(define (with-random-sleep proc) + (lambda args + (random-sleep) + (apply proc args))) + +(define (make-serializer) + (define sem (make-semaphore 1)) + (lambda (proc) + (lambda args + (semaphore-wait sem) + (define ret (apply proc args)) + (semaphore-post sem) + ret))) + +(define (table) + (random-sleep) + (define forks (list (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1) + (make-semaphore 1))) + (define (pick-fork i) + (random-sleep) + (semaphore-wait (list-ref forks i))) + (define (put-fork i) + (random-sleep) + (semaphore-post (list-ref forks i))) + (define (dispatch m) + (cond [(eq? m 'pick-fork) pick-fork] + [(eq? m 'put-fork) put-fork] + [else (error "Unknown request -- TABLE" + m)])) + dispatch) + +(define dtable (table)) + +(define (philosopher dining-table number) + (define my-turn (make-serializer)) + (define (eat) + (display "Zaczynam ") + (display number) + (newline) + ((dining-table 'pick-fork) number) + ((dining-table 'put-fork) number) + ((dining-table 'pick-fork) (modulo (+ number 1) 5)) + ((dining-table 'put-fork) (modulo (+ number 1) 5)) + (display "Koncze ") + (display number) + (newline)) + (my-turn eat))
\ No newline at end of file diff --git a/Semestr 2/racket/l15/solution.bak b/Semestr 2/racket/l15/solution.bak new file mode 100644 index 0000000..03ab86a --- /dev/null +++ b/Semestr 2/racket/l15/solution.bak @@ -0,0 +1,7 @@ +#lang racket + + + +(define (run-concurrent . thunks) + (define threads (map thread thunks)) + (for-each thread-wait threads))
\ No newline at end of file diff --git a/Semestr 2/racket/l15/solution.rkt b/Semestr 2/racket/l15/solution.rkt new file mode 100644 index 0000000..915502e --- /dev/null +++ b/Semestr 2/racket/l15/solution.rkt @@ -0,0 +1,85 @@ +#lang racket + +(provide philosopher) + +;; Do debugu + +(define (run-concurrent . thunks) + (define threads (map thread thunks)) + (for-each thread-wait threads)) + +(define (random-sleep) + (sleep (/ (random) 100))) + +(define (with-random-sleep proc) + (lambda args + (random-sleep) + (apply proc args))) + +(define (make-serializer) + (define sem (make-semaphore 1)) + (lambda (proc) + (lambda args + (semaphore-wait sem) + (define ret (apply proc args)) + (semaphore-post sem) + ret))) + +(define (make-table) + (define forks (map (lambda (x) (make-semaphore 1)) '(0 1 2 3 4))) + (define (get-fork i) + (list-ref forks i)) + (define (pick-fork i) + (random-sleep) + (semaphore-wait (get-fork i))) + (define (put-fork i) + (random-sleep) + (semaphore-post (get-fork i))) + (define (dispatch m) + (cond [(eq? m 'pick-fork) pick-fork] + [(eq? m 'put-fork) put-fork] + [else (error "Unknown request -- MAKE-TABLE" m)])) + dispatch) + +;(define dining-table (make-table)) + +;(define (repeat proc n) +; (if (> n 0) +; (begin +; (proc) +; (repeat proc (- n 1))) +; #f)) +; +;(define (hungry nr x) +; (lambda () (repeat (lambda () (philosopher dining-table nr)) x))) + +;; Rozwiązanie: + +(define forks-sem (map (lambda (x) (make-semaphore 1)) '(0 0 0 0 0))) + +(define (get-fork i) + (list-ref forks-sem i)) + +(define (is-free? i) + (semaphore-try-wait? (get-fork i))) + +(define (put-fork dining-table i) + ((dining-table 'put-fork) i) + (semaphore-post (get-fork i))) + +(define (philosopher dining-table i) + (define left-fork i) + (define right-fork (modulo (+ i 1) 5)) + (define (loop) + (if (is-free? left-fork) + (if (is-free? right-fork) + (begin + ((dining-table 'pick-fork) left-fork) + ((dining-table 'pick-fork) right-fork) + (put-fork dining-table left-fork) + (put-fork dining-table right-fork)) + (loop)) + (begin + (semaphore-post (get-fork left-fork)) + (loop)))) + (loop))
\ No newline at end of file diff --git a/Semestr 2/racket/l7z12/solution.rkt b/Semestr 2/racket/l7z12/solution.rkt new file mode 100644 index 0000000..089dee4 --- /dev/null +++ b/Semestr 2/racket/l7z12/solution.rkt @@ -0,0 +1,95 @@ +#lang racket
+
+(provide (struct-out const)
+ (struct-out binop)
+ (struct-out var-expr)
+ (struct-out let-expr)
+ (struct-out pos)
+ (struct-out var-free)
+ (struct-out var-bound)
+ annotate-expression)
+
+;; ---------------
+;; Jezyk wejsciowy
+;; ---------------
+
+(struct pos (file line col) #:transparent)
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (loc id e1 e2) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (number? n)]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr loc x e1 e2)
+ (and (pos? loc) (symbol? x) (expr? e1) (expr? e2))]
+ [_ false]))
+
+(define (make-pos s)
+ (pos (syntax-source s)
+ (syntax-line s)
+ (syntax-column s)))
+
+(define (parse e)
+ (let ([r (syntax-e e)])
+ (cond
+ [(number? r) (const r)]
+ [(symbol? r) (var-expr r)]
+ [(and (list? r) (= 3 (length r)))
+ (match (syntax-e (car r))
+ ['let (let* ([e-def (syntax-e (second r))]
+ [x (syntax-e (first e-def))])
+ (let-expr (make-pos (first e-def))
+ (if (symbol? x) x (error "parse error!"))
+ (parse (second e-def))
+ (parse (third r))))]
+ [op (binop op (parse (second r)) (parse (third r)))])]
+ [else (error "parse error!")])))
+
+;; ---------------
+;; Jezyk wyjsciowy
+;; ---------------
+
+(struct var-free (id) #:transparent)
+(struct var-bound (pos id) #:transparent)
+
+(define (expr-annot? e)
+ (match e
+ [(const n) (number? n)]
+ [(binop op l r) (and (symbol? op) (expr-annot? l) (expr-annot? r))]
+ [(var-free x) (symbol? x)]
+ [(var-bound loc x) (and (pos? loc) (symbol? x))]
+ [(let-expr loc x e1 e2)
+ (and (pos? loc) (symbol? x) (expr-annot? e1) (expr-annot? e2))]
+ [_ false]))
+
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) false]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+(define (annotate-expression-env e env)
+ (match e
+ [(const r) (const r)]
+ [(binop op l r) (binop op (annotate-expression-env l env) (annotate-expression-env r env))]
+ [(var-expr x) (let ((pos (env-lookup x env)))
+ (if pos
+ (var-bound pos x)
+ (var-free x)))]
+ [(let-expr loc x e1 e2) (let-expr loc x (annotate-expression-env e1 env) (annotate-expression-env e2 (env-add x loc env)))]))
+
+(define (annotate-expression e)
+ (annotate-expression-env e env-empty))
+
+(define (test) (annotate-expression (parse #'(let [x 5] (let [x (* x y)] (+ x y))))))
diff --git a/Semestr 2/racket/l7z13/solution.rkt b/Semestr 2/racket/l7z13/solution.rkt new file mode 100644 index 0000000..0a0278a --- /dev/null +++ b/Semestr 2/racket/l7z13/solution.rkt @@ -0,0 +1,104 @@ +#lang racket
+
+(provide (struct-out const) (struct-out binop) (struct-out var-expr) (struct-out let-expr) (struct-out var-dead) find-dead-vars)
+
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct var-dead (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (number? n)]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(var-dead x) (symbol? x)]
+ [(let-expr x e1 e2) (and (symbol? x) (expr? e1) (expr? e2))]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+; ---------------------------------- ;
+; Wyszukaj ostatnie uzycie zmiennych ;
+; ---------------------------------- ;
+
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "unbound identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+(define (env-erase x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "unbound identifier" x)]
+ [(eq? x (caar xs)) (cdr xs)]
+ [else (cons (car xs) (assoc-lookup (cdr xs)))]))
+ (if (env-lookup x env)
+ (environ (assoc-lookup (assoc-lookup (environ-xs env))))
+ (environ (assoc-lookup (environ-xs env)))))
+
+
+(define (find-dead-vars-env e env)
+ (match e
+ [(const r) (cons (const r) env)]
+ [(var-expr x) (if (env-lookup x env)
+ (cons (var-expr x) env)
+ (cons (var-dead x) (env-add x true env)))]
+ [(binop op l r) (let* ((right-expr (find-dead-vars-env r env))
+ (r (car right-expr))
+ (env (cdr right-expr))
+ (left-expr (find-dead-vars-env l env))
+ (l (car left-expr))
+ (env (cdr left-expr)))
+ (cons (binop op l r) env))]
+ [(let-expr x e1 e2) (let* ((right-expr (find-dead-vars-env e2 (env-add x false env)))
+ (e2 (car right-expr))
+ (env (env-erase x (cdr right-expr)))
+ (left-expr (find-dead-vars-env e1 env))
+ (e1 (car left-expr))
+ (env (cdr left-expr)))
+ (cons (let-expr x e1 e2) env))]))
+
+(define (find-dead-vars e)
+ (car (find-dead-vars-env e env-empty)))
+
+
+(define (sample2) (find-dead-vars (let-expr 'x (const 3)
+ (binop '+ (var-expr 'x)
+ (let-expr 'x (const 5) (binop '+ (var-expr 'x) (var-expr 'x)))))))
+
+(define (test1) (find-dead-vars (parse '(let (x 3) (let (x (* x (+ x x))) (+ x x))))))
+(define (test2) (find-dead-vars (parse '(let (x 2) (let [x (let [x (+ x 2)] x)] x)))))
+(define (test3) (find-dead-vars (parse '(let [x 2] (+ (let [x (+ 2 x)] (* 3 x)) x)))))
+(define (test4) (find-dead-vars (parse '(let [x 2] (let [x (+ x 3)] (* x x))))))
+(define (test5) (find-dead-vars (parse '(let [x 2] (+ x (let [x (+ 2 x)] x))))))
+(define (test6) (find-dead-vars (parse '(let [x 2]
+ (let [y (let [x (* x (+ x x))]
+ (let [y (* x x)]
+ (+ y 2)))]
+ (+ x (* y y)))))))
+(define (test7) (find-dead-vars (parse '(let [x (let [x (let [x 2] (+ x x))] (+ x x))] (+ x x)))))
+;;; (define (test7) (find-dead-vars (parse '(let [x (let [x (let [x 2] (let (x 2) (+ x x)))] (+ x x))] (+ x x)))))
+(define (test8) (find-dead-vars (parse '(let [x 2] (let [x 2] (+ x x))))))
\ No newline at end of file diff --git a/Semestr 2/racket/l8z14/solution.bak b/Semestr 2/racket/l8z14/solution.bak new file mode 100644 index 0000000..b51383a --- /dev/null +++ b/Semestr 2/racket/l8z14/solution.bak @@ -0,0 +1,155 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct car-expr (e) #:transparent) +(struct cdr-expr (e) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(car-expr e) (expr? e)] + [(cdr-expr e) (expr? e)] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!! + (parse-lam (second q) (third q))] + [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(car-expr e) (car (eval-env e env))] + [(cdr-expr e) (cdr (eval-env e env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(let [twice (lambda (f x) (f (f x)))] + (let [inc (lambda (x) (+ 1 x))] + (twice twice twice twice inc 1)))) + + +(define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/l8z14/solution.rkt b/Semestr 2/racket/l8z14/solution.rkt new file mode 100644 index 0000000..59556cf --- /dev/null +++ b/Semestr 2/racket/l8z14/solution.rkt @@ -0,0 +1,201 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(provide eval parse) + + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct car-expr (e) #:transparent) +(struct cdr-expr (e) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! +(struct apply-expr (f xs) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(car-expr e) (expr? e)] + [(cdr-expr e) (expr? e)] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [(apply-expr f xs) (and (expr? f) (expr? xs))] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (> (length q) 0) (list? q) (eq? (first q) 'list)) + (parse-list (cdr q))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'apply)) + (apply-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!! + (parse-lam (second q) (third q))] + [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +(define (parse-list q) + (if (null? q) + (null-expr) + (cons-expr (parse (car q)) (parse-list (cdr q))))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(car-expr e) (car (eval-env e env))] + [(cdr-expr e) (cdr (eval-env e env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(apply-expr e1 e2) + (let ([xs (eval-env e2 env)]) + (eval-env (eval-apply e1 (reverse xs)) env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval-apply e xs) + (if (null? xs) + e + (app (eval-apply e (cdr xs)) (const (car xs))))) + +(define (eval e) (eval-env e env-empty)) + +;; testy wspólnie z Karolem Ochmanem + +(define program1 + '(apply (lambda (x y) (+ x y)) + (cons 1 (cons 2 null)))) +(define program2 + '(apply (lambda (x y z) (+ x (+ y z))) + (cons 1 (cons 2 null)))) +(define program3 + '(apply (lambda (x y) (lambda (z) (+ x (+ y z)))) + (cons 1 (cons 2 (cons 3 null))))) +(define program4 + '(apply (lambda (x y) (+ x y)) + (cons 1 (cons 2 (cons 3 null))))) +(define program5 + '(let [f (lambda (x y z) (+ z (+ x y)))] + (apply (f 3) (cons 1 (cons 2 null))))) +(define program6 + '(let [f (lambda (x) x)] + (apply (f 4) null))) +(define program7 + '(apply (lambda (q w e r t y u i o p a s d f g h j k l) 3) + (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 + (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 + (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 null))))))))))))))))))))) +(define program8 + '(apply (lambda (q w e r t y u i o p a s d f g h j k l) 3) + (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 (cons 1 + (cons 1 (cons 1 (cons 1 (cons 1 null)))))))))))))))
\ No newline at end of file diff --git a/Semestr 2/racket/l8z15/solution.bak b/Semestr 2/racket/l8z15/solution.bak new file mode 100644 index 0000000..cdc84f9 --- /dev/null +++ b/Semestr 2/racket/l8z15/solution.bak @@ -0,0 +1,187 @@ +#lang racket
+
+; Do list.rkt dodajemy procedury
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+(provide parse eval)
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct car-expr (e) #:transparent)
+(struct cdr-expr (e) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent) ; <------------------ !!!
+(struct lam (id e) #:transparent) ; <------------------ !!!
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(car-expr e) (expr? e)]
+ [(cdr-expr e) (expr? e)]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!!
+ [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!!
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car))
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr))
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!!
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!!
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (parse-app q) ; <----------------------------------------- !!!
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e) ; <------------------------------------- !!!
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent) ; <------------------------- !!!
+(struct odr (e env) #:transparent)
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v))) ; <---------------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ [_ false])) ; <--------------------------------------- !!!
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (match (env-lookup x env)
+ [(odr e env) (eval-env e env)]
+ [f f])]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (odr e1 env)
+ (odr e2 env))]
+ [(car-expr e) (let ([p (eval-env e env)])
+ (match (car p)
+ [(odr e env) (eval-env e env)]))]
+ [(cdr-expr e) (let ([p (eval-env e env)])
+ (match (cdr p)
+ [(odr e env) (eval-env e env)]))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)] ; <--------------------------------- !!!
+ [(app f e) ; <------------------------------------------------ !!!
+ (let ([vf (eval-env f env)]
+ [ve (odr e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(let [twice (lambda (f x) (f (f x)))]
+ (let [inc (lambda (x) (+ 1 x))]
+ (twice twice twice twice inc 1))))
+
+
+;;; Testy wspólnie z Karolem Ochmanem
+
+(define (test-eval program) (eval (parse program)))
+
+(define program1
+ '((lambda (x) (+ 3 3)) (/ 5 0)))
+(define program2
+ '(let [if-fun (lambda (b t e) (if b t e))]
+ (if-fun true 4 (/ 5 0))))
+(define program3
+ '(car (cdr (cons 1 (cons 2 (cons 3 (cons 4 null)))))))
+(define program4
+ '(car (cons (+ 3 4) (/ 5 0))))
+(define program5
+ '(cons (+ 5 6) (- 4 3)))
+(define program6
+ '(car (cdr (cdr (car (cons (cons (/ 0 0) (cons (/ 0 0) (cons 1 (/ 0 0)))) (cdr (cons (/ 0 0) null))))))))
+;;; (test-eval program)
+;;; (test-eval program1)
+;;; (test-eval program2)
+;;; (test-eval program3)
+;;; (test-eval program4)
+;;; (test-eval program5)
+;;; (test-eval program6)
\ No newline at end of file diff --git a/Semestr 2/racket/l8z15/solution.rkt b/Semestr 2/racket/l8z15/solution.rkt new file mode 100644 index 0000000..54b6cd3 --- /dev/null +++ b/Semestr 2/racket/l8z15/solution.rkt @@ -0,0 +1,182 @@ +#lang racket
+
+; Do list.rkt dodajemy procedury
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+(provide parse eval)
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct car-expr (e) #:transparent)
+(struct cdr-expr (e) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent) ; <------------------ !!!
+(struct lam (id e) #:transparent) ; <------------------ !!!
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(car-expr e) (expr? e)]
+ [(cdr-expr e) (expr? e)]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!!
+ [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!!
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car))
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr))
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!!
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!!
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (parse-app q) ; <----------------------------------------- !!!
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e) ; <------------------------------------- !!!
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent) ; <------------------------- !!!
+(struct odr (e env) #:transparent)
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v))) ; <---------------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ [_ false])) ; <--------------------------------------- !!!
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(var-expr x) (match (env-lookup x env)
+ [(odr e env) (eval-env e env)]
+ [f f])]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (odr e1 env)
+ (odr e2 env))]
+ [(car-expr e) (let ([p (eval-env e env)])
+ (match (car p)
+ [(odr e env) (eval-env e env)]))]
+ [(cdr-expr e) (let ([p (eval-env e env)])
+ (match (cdr p)
+ [(odr e env) (eval-env e env)]))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)] ; <--------------------------------- !!!
+ [(app f e) ; <------------------------------------------------ !!!
+ (let ([vf (eval-env f env)]
+ [ve (odr e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval e) (eval-env e env-empty))
+
+
+;;; Testy wspólnie z Karolem Ochmanem
+
+(define (test-eval program) (eval (parse program)))
+
+(define program1
+ '((lambda (x) (+ 3 3)) (/ 5 0)))
+(define program2
+ '(let [if-fun (lambda (b t e) (if b t e))]
+ (if-fun true 4 (/ 5 0))))
+(define program3
+ '(car (cdr (cons 1 (cons 2 (cons 3 (cons 4 null)))))))
+(define program4
+ '(car (cons (+ 3 4) (/ 5 0))))
+(define program5
+ '(cons (+ 5 6) (- 4 3)))
+(define program6
+ '(car (cdr (cdr (car (cons (cons (/ 0 0) (cons (/ 0 0) (cons 1 (/ 0 0)))) (cdr (cons (/ 0 0) null))))))))
+;;; (test-eval program)
+;;; (test-eval program1)
+;;; (test-eval program2)
+;;; (test-eval program3)
+;;; (test-eval program4)
+;;; (test-eval program5)
+;;; (test-eval program6)
\ No newline at end of file diff --git a/Semestr 2/racket/l9/zad4.rkt b/Semestr 2/racket/l9/zad4.rkt new file mode 100644 index 0000000..7b5e0bc --- /dev/null +++ b/Semestr 2/racket/l9/zad4.rkt @@ -0,0 +1,202 @@ +#lang racket
+
+; Do fun.rkt dodajemy rekurencyjne let-y
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct letrec-expr (id e1 e2) #:transparent) ; <----------------- !!!
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct car-expr (e) #:transparent)
+(struct cdr-expr (e) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent)
+(struct lam (id e) #:transparent)
+(struct citation (q) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(letrec-expr x e1 e2) ; <------------------------------------ !!!
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(car-expr e) (expr? e)]
+ [(cdr-expr e) (expr? e)]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))]
+ [(lam id e) (and (symbol? id) (expr? e))]
+ [(citation q) true]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? 'quote (first q))) (citation (second q))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car))
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr))
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'letrec)) ; <!!!
+ (letrec-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda))
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q))))
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (parse-app q)
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e)
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct blackhole () #:transparent) ; <------------------------- !!!
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (mcons x v) (environ-xs env)))) ; <-------------- !!!
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs))) ; <---------------------------- !!!
+ (match (mcdr (car xs))
+ [(blackhole) (error "Stuck forever in a black hole!")]
+ [x x])]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+(define (env-update! x v xs) ; <---------------------------------- !!!
+ (define (assoc-update! xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs))) (set-mcdr! (car xs) v)]
+ [else (env-update! x v (cdr xs))]))
+ (assoc-update! (environ-xs xs)))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent)
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v)
+ (blackhole? v))) ; <---------------------------------------- !!!
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ [_ false]))
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(citation q) q]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (eval-env e1 env) env))]
+ [(letrec-expr x e1 e2) ; <------------------------------------ !!!
+ (let* ([new-env (env-add x (blackhole) env)]
+ [v (eval-env e1 new-env)])
+ (begin
+ (env-update! x v new-env)
+ (eval-env e2 new-env)))]
+ [(var-expr x) (env-lookup x env)]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env)
+ (eval-env e2 env))]
+ [(car-expr e) (car (eval-env e env))]
+ [(cdr-expr e) (cdr (eval-env e env))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)]
+ [(app f e)
+ (let ([vf (eval-env f env)]
+ [ve (eval-env e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve fun-env))]))]))
+
+(define (eval e) (eval-env e env-empty))
+
+(define program
+ '(letrec
+ [fact (lambda (n) (if (= n 0) 1 (* n (fact (- n 1)))))]
+ (letrec
+ [even-odd
+ (cons
+ (lambda (x)
+ (if (= x 0) true ((cdr even-odd) (- x 1))))
+ (lambda (x)
+ (if (= x 0) false ((car even-odd) (- x 1)))))]
+ (let [even (car even-odd)]
+ (let [odd (cdr even-odd)]
+ (even (fact 6)))))))
+
+(define PROGRAM
+ '(letrec [from-to (lambda (n k)
+ (if (> n k)
+ null
+ (cons n (from-to (+ n 1) k))))]
+ (letrec [sum (lambda (xs)
+ (if (null? xs)
+ 0
+ (+ (car xs) (sum (cdr xs)))))]
+ (sum (from-to 1 36)))))
+
+(define (test-eval) (eval (parse PROGRAM)))
\ No newline at end of file diff --git a/Semestr 2/racket/l9/zad7.rkt b/Semestr 2/racket/l9/zad7.rkt new file mode 100644 index 0000000..207162d --- /dev/null +++ b/Semestr 2/racket/l9/zad7.rkt @@ -0,0 +1,340 @@ +#lang racket
+
+;; Składnia abstrakcyjna
+(struct const (val) #:transparent)
+(struct var-expr (name) #:transparent)
+(struct let-expr (id bound body) #:transparent)
+(struct letrec-expr (id bound body) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct lambda-expr (arg body) #:transparent)
+(struct app-expr (fun arg) #:transparent)
+(struct display-expr (e) )
+
+(define (keyword s)
+ (member s '(true false null and or if cond else lambda let letrec display read)))
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n)
+ (boolean? n)
+ (null? n)
+ (string? n))]
+ [(var-expr id) (symbol? id)]
+ [(let-expr x e1 e2 ) (and (symbol? x)
+ (expr? e1)
+ (expr? e2))]
+ [(letrec-expr x e1 e2) (and (symbol? x)
+ (expr? e1)
+ (expr? e2))]
+ [(if-expr eb et ef) (and (expr? eb)
+ (expr? et)
+ (expr? ef))]
+ [(lambda-expr x e) (and (symbol? x)
+ (expr? e))]
+ [(app-expr ef ea) (and (expr? ef)
+ (expr? ea))]
+ [_ false]))
+
+;; Parsowanie (zacytowane wyrażenie -> składnia abstrakcyjna)
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(string? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (const null)]
+ [(and (symbol? q)
+ (not (keyword q)))
+ (var-expr q)]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'let)
+ (list? (second q))
+ (= (length (second q)) 2)
+ (symbol? (first (second q))))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'letrec)
+ (list? (second q))
+ (= (length (second q)) 2)
+ (symbol? (first (second q))))
+ (letrec-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q)
+ (= (length q) 4)
+ (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q)
+ (pair? q)
+ (eq? (first q) 'and))
+ (desugar-and (map parse (cdr q)))]
+ [(and (list? q)
+ (pair? q)
+ (eq? (first q) 'or))
+ (desugar-or (map parse (cdr q)))]
+ [(and (list? q)
+ (>= (length q) 2)
+ (eq? (first q) 'cond))
+ (parse-cond (cdr q))]
+ [(and (list? q)
+ (= (length q) 3)
+ (eq? (first q) 'lambda)
+ (list? (second q))
+ (andmap symbol? (second q))
+ (cons? (second q)))
+ (desugar-lambda (second q) (parse (third q)))]
+ [(and (list? q)
+ (>= (length q) 2))
+ (desugar-app (parse (first q)) (map parse (cdr q)))]
+ [else (error "Unrecognized token:" q)]))
+
+(define (parse-cond qs)
+ (match qs
+ [(list (list 'else q))
+ (parse q)]
+
+ [(list (list q _))
+ (error "Expected 'else' in last branch but found:" q)]
+
+ [(cons (list qb qt) qs)
+ (if-expr (parse qb) (parse qt) (parse-cond qs))]))
+
+(define (desugar-and es)
+ (if (null? es)
+ (const true)
+ (if-expr (car es) (desugar-and (cdr es)) (const false))))
+
+(define (desugar-or es)
+ (if (null? es)
+ (const false)
+ (if-expr (car es) (const true) (desugar-or (cdr es)))))
+
+(define (desugar-lambda xs e)
+ (if (null? xs)
+ e
+ (lambda-expr (car xs) (desugar-lambda (cdr xs) e))))
+
+(define (desugar-app e es)
+ (if (null? es)
+ e
+ (desugar-app (app-expr e (car es)) (cdr es))))
+
+;; Środowiska
+(struct blackhole ())
+(struct environ (xs))
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (mcons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs)
+ (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs)))
+ (let ((v (mcdr (car xs))))
+ (if (blackhole? v)
+ (error "Jumped into blackhole at" x)
+ v))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+(define (env-update! x v env)
+ (define (assoc-update xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs)))
+ (set-mcdr! (car xs) v)]
+ [else (assoc-update (cdr xs))]))
+ (assoc-update (environ-xs env)))
+
+;; Domknięcia
+(struct clo (arg body env))
+
+;; Procedury wbudowane, gdzie
+;; proc — Racketowa procedura którą należy uruchomić
+;; args — lista dotychczas dostarczonych argumentów
+;; pnum — liczba brakujących argumentów (> 0)
+;; W ten sposób pozwalamy na częściową aplikację Racketowych procedur
+;; — zauważmy że zawsze znamy pnum, bo w naszym języku arność
+;; procedury jest ustalona z góry
+(struct builtin (proc args pnum))
+
+;; Pomocnicze konstruktory procedur unarnych i binarnych
+(define (builtin/1 p)
+ (builtin p null 1))
+(define (builtin/2 p)
+ (builtin p null 2))
+
+;; Procedury
+(define (proc? v)
+ (or (and (clo? v)
+ (symbol? (clo-arg v))
+ (expr? (clo-body v))
+ (environ? (clo-env v)))
+ (and (builtin? v)
+ (procedure? (builtin-proc v))
+ (andmap value? (builtin-args v))
+ (natural? (builtin-pnum v))
+ (> (builtin-pnum v) 0))))
+
+;; Definicja typu wartości
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (null? v)
+ (string? v)
+ (and (cons? v)
+ (value? (car v))
+ (value? (cdr v)))
+ (proc? v)))
+
+;; Środowisko początkowe (przypisujące procedury wbudowane ich nazwom)
+
+(define start-env
+ (foldl (lambda (p env) (env-add (first p) (second p) env))
+ env-empty
+ `((+ ,(builtin/2 +))
+ (- ,(builtin/2 -))
+ (* ,(builtin/2 *))
+ (/ ,(builtin/2 /))
+ (~ ,(builtin/1 -))
+ (< ,(builtin/2 <))
+ (> ,(builtin/2 >))
+ (= ,(builtin/2 =))
+ (<= ,(builtin/2 <=))
+ (>= ,(builtin/2 >=))
+ (not ,(builtin/1 not))
+ (cons ,(builtin/2 cons))
+ (car ,(builtin/1 car))
+ (cdr ,(builtin/1 cdr))
+ (pair? ,(builtin/1 cons?))
+ (null? ,(builtin/1 null?))
+ (boolean? ,(builtin/1 boolean?))
+ (number? ,(builtin/1 number?))
+ (procedure? ,(builtin/1 (lambda (x) (or (clo? x) (builtin? x)))))
+ (string? ,(builtin/1 string?))
+ (string-= ,(builtin/2 string=?))
+ ;; and so on, and so on
+ )))
+
+;; Ewaluator
+(define (eval-env e env)
+ (match e
+ [(const n)
+ n]
+
+ [(var-expr x)
+ (env-lookup x env)]
+
+ [(let-expr x e1 e2)
+ (let ((v1 (eval-env e1 env)))
+ (eval-env e2 (env-add x v1 env)))]
+
+ [(letrec-expr f ef eb)
+ (let* ((new-env (env-add f (blackhole) env))
+ (vf (eval-env ef new-env)))
+ (env-update! f vf new-env)
+ (eval-env eb new-env))]
+
+ [(if-expr eb et ef)
+ (match (eval-env eb env)
+ [#t (eval-env et env)]
+ [#f (eval-env ef env)]
+ [v (error "Not a boolean:" v)])]
+
+ [(lambda-expr x e)
+ (clo x e env)]
+
+ [(app-expr ef ea)
+ (let ((vf (eval-env ef env))
+ (va (eval-env ea env)))
+ (match vf
+ [(clo x e env)
+ (eval-env e (env-add x va env))]
+ [(builtin p args nm)
+ (if (= nm 1)
+ (apply p (reverse (cons va args)))
+ (builtin p (cons va args) (- nm 1)))]
+ [_ (error "Not a function:" vf)]))]))
+
+(define (eval e)
+ (eval-env e start-env))
+
+
+;; REPL — interpreter interaktywny (read-eval-print loop)
+
+;; dodajemy składnię na wiązanie zmiennych "na poziomie interpretera"
+;; i komendę wyjścia "exit" ...
+(struct letrec-repl (id expr))
+(struct let-repl (id expr))
+(struct exit-repl ())
+
+;; ... a także rozszerzoną procedurę parsującą te dodatkowe komendy i
+;; prostą obsługę błędów
+(define (parse-repl q)
+ (with-handlers
+ ([exn? (lambda (exn)
+ (display "Parse error! ")
+ (displayln (exn-message exn)))])
+ (cond
+ [(eq? q 'exit) (exit-repl)]
+ [(and (list? q)
+ (= 3 (length q))
+ (eq? (first q) 'let))
+ (let-repl (second q) (parse (third q)))]
+ [(and (list? q)
+ (= 3 (length q))
+ (eq? (first q) 'letrec))
+ (letrec-repl (second q) (parse (third q)))]
+ [else (parse q)])))
+
+;; trochę zamieszania w procedurze eval-repl wynika z rudymentarnej
+;; obsługi błędów: nie chcemy żeby błąd w interpretowanym programie
+;; kończył działanie całego interpretera!
+(define (eval-repl c env continue)
+ (define (eval-with-err e env)
+ (with-handlers
+ ([exn? (lambda (exn)
+ (display "Error! ")
+ (displayln (exn-message exn)))])
+ (eval-env e env)))
+ (match c
+ [(exit-repl)
+ (void)]
+
+ [(let-repl x e)
+ (let ((v (eval-with-err e env)))
+ (if (void? v)
+ (continue env)
+ (continue (env-add x v env))))]
+
+ [(letrec-repl f e)
+ (let* ((new-env (env-add f (blackhole) env))
+ (v (eval-with-err e new-env)))
+ (if (void? v)
+ (continue env)
+ (begin
+ (env-update! f v new-env)
+ (continue new-env))))]
+
+ [_
+ (let ((v (eval-with-err c env)))
+ (unless (void? v)
+ (displayln v))
+ (continue env))]))
+
+;; I w końcu interaktywny interpreter
+(define (repl)
+ (define (go env)
+ (display "FUN > ")
+ (let* ((q (read))
+ (c (parse-repl q)))
+ (if (void? c)
+ (go env)
+ (eval-repl c env go))))
+ (displayln "Welcome to the FUN functional language interpreter!")
+ (go start-env))
\ No newline at end of file diff --git a/Semestr 2/racket/l9z16/solution.rkt b/Semestr 2/racket/l9z16/solution.rkt new file mode 100644 index 0000000..0af169d --- /dev/null +++ b/Semestr 2/racket/l9z16/solution.rkt @@ -0,0 +1,42 @@ +#lang racket
+
+(provide lcons lnull lnull? lcar lcdr)
+
+
+(define (lcons x f) (mcons x f))
+
+(define lnull null)
+
+(define lnull? null?)
+
+(define (lcar xs) (mcar xs))
+
+(define (lcdr xs)
+ (let ([x (mcdr xs)])
+ (cond [(not (mpair? x)) (set-mcdr! xs (x))]))
+ (mcdr xs))
+
+(define (from n)
+ (lcons n (lambda () (from (+ n 1)))))
+
+(define nats
+ (from 0))
+
+(define (lnth n xs)
+ (cond [(= n 0) (lcar xs)]
+ [else (lnth (- n 1) (lcdr xs))]))
+
+(define (lfilter p xs)
+ (cond [(lnull? xs) lnull]
+ [(p (lcar xs))
+ (lcons (lcar xs) (lambda () (lfilter p (lcdr xs))))]
+ [else (lfilter p (lcdr xs))]))
+
+(define (prime? n)
+ (define (factors i)
+ (cond [(>= i n) (list n)]
+ [(= (modulo n i) 0) (cons i (factors (+ i 1)))]
+ [else (factors (+ i 1))]))
+ (= (length (factors 1)) 2))
+
+(define primes (lfilter prime? (from 2)))
\ No newline at end of file diff --git a/Semestr 2/racket/l9z17/solution.rkt b/Semestr 2/racket/l9z17/solution.rkt new file mode 100644 index 0000000..5e98036 --- /dev/null +++ b/Semestr 2/racket/l9z17/solution.rkt @@ -0,0 +1,266 @@ +#lang racket
+
+; Do programming.rkt dodajemy instrukcje
+
+(provide eval-while parse-while env-empty env-lookup)
+
+;;; We współpracy z Kacprem Soleckim
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+
+(struct const (val) #:transparent)
+(struct binop (op l r) #:transparent)
+(struct var-expr (id) #:transparent)
+(struct let-expr (id e1 e2) #:transparent)
+(struct letrec-expr (id e1 e2) #:transparent)
+(struct if-expr (eb et ef) #:transparent)
+(struct cons-expr (e1 e2) #:transparent)
+(struct car-expr (e) #:transparent)
+(struct cdr-expr (e) #:transparent)
+(struct null-expr () #:transparent)
+(struct null?-expr (e) #:transparent)
+(struct app (f e) #:transparent)
+(struct lam (id e) #:transparent)
+
+(define (expr? e)
+ (match e
+ [(const n) (or (number? n) (boolean? n) (string? n))]
+ [(binop op l r) (and (symbol? op) (expr? l) (expr? r))]
+ [(var-expr x) (symbol? x)]
+ [(let-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(letrec-expr x e1 e2)
+ (and (symbol? x) (expr? e1) (expr? e2))]
+ [(if-expr eb et ef)
+ (and (expr? eb) (expr? et) (expr? ef))]
+ [(cons-expr e1 e2) (and (expr? e1) (expr? e2))]
+ [(car-expr e) (expr? e)]
+ [(cdr-expr e) (expr? e)]
+ [(null-expr) true]
+ [(null?-expr e) (expr? e)]
+ [(app f e) (and (expr? f) (expr? e))]
+ [(lam id e) (and (symbol? id) (expr? e))]
+ [_ false]))
+
+(define (parse q)
+ (cond
+ [(number? q) (const q)]
+ [(eq? q 'true) (const true)]
+ [(eq? q 'false) (const false)]
+ [(eq? q 'null) (null-expr)]
+ [(string? q) (const q)]
+ [(symbol? q) (var-expr q)]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?))
+ (null?-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons))
+ (cons-expr (parse (second q))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car))
+ (car-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr))
+ (cdr-expr (parse (second q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let))
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'letrec))
+ (letrec-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if))
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda))
+ (parse-lam (second q) (third q))]
+ [(and (list? q) (pair? q) (not (op->proc (car q))))
+ (parse-app q)]
+ [(and (list? q) (eq? (length q) 3) (symbol? (first q)))
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]))
+
+(define (parse-app q)
+ (define (parse-app-accum q acc)
+ (cond [(= 1 (length q)) (app acc (parse (car q)))]
+ [else (parse-app-accum (cdr q) (app acc (parse (car q))))]))
+ (parse-app-accum (cdr q) (parse (car q))))
+
+(define (parse-lam pat e)
+ (cond [(= 1 (length pat))
+ (lam (car pat) (parse e))]
+ [else
+ (lam (car pat) (parse-lam (cdr pat) e))]))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+
+(struct blackhole () #:transparent)
+(struct environ (xs) #:transparent)
+
+(define env-empty (environ null))
+(define (env-add x v env)
+ (environ (cons (mcons x v) (environ-xs env))))
+(define (env-lookup x env)
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs)))
+ (match (mcdr (car xs))
+ [(blackhole) (error "Stuck forever in a black hole!")]
+ [x x])]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+(define (env-update! x v xs)
+ (define (assoc-update! xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (mcar (car xs))) (set-mcdr! (car xs) v)]
+ [else (env-update! x v (cdr xs))]))
+ (assoc-update! (environ-xs xs)))
+(define (env-update x v xs) ; <---------------------------------- !!!
+ (define (assoc-update xs)
+ (cond [(null? xs) (list (mcons x v))]
+ [(eq? x (mcar (car xs))) (cons (mcons x v) (cdr xs))]
+ [else (cons (car xs) (assoc-update (cdr xs)))]))
+ (environ (assoc-update (environ-xs xs))))
+
+; --------- ;
+; Ewaluacja ;
+; --------- ;
+
+(struct clo (id e env) #:transparent)
+(struct let-var (v) #:transparent)
+
+(define (value? v)
+ (or (number? v)
+ (boolean? v)
+ (string? v)
+ (and (pair? v) (value? (car v)) (value? (cdr v)))
+ (null? v)
+ (clo? v)
+ (blackhole? v)))
+
+(define (op->proc op)
+ (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo]
+ ['= =] ['> >] ['>= >=] ['< <] ['<= <=]
+ ['and (lambda (x y) (and x y))]
+ ['or (lambda (x y) (or x y))]
+ ['eq? eq?]
+ [_ false]))
+
+(define (eval-env e env)
+ (match e
+ [(const n) n]
+ [(binop op l r) ((op->proc op) (eval-env l env)
+ (eval-env r env))]
+ [(let-expr x e1 e2)
+ (eval-env e2 (env-add x (let-var (eval-env e1 env)) env))]
+ [(letrec-expr x e1 e2)
+ (let* ([new-env (env-add x (blackhole) env)]
+ [v (eval-env e1 new-env)])
+ (begin
+ (env-update! x v new-env)
+ (eval-env e2 new-env)))]
+ [(var-expr x) (let ((f (env-lookup x env)))
+ (if (let-var? f) (let-var-v f) f))]
+ [(if-expr eb et ef) (if (eval-env eb env)
+ (eval-env et env)
+ (eval-env ef env))]
+ [(cons-expr e1 e2) (cons (eval-env e1 env)
+ (eval-env e2 env))]
+ [(car-expr e) (car (eval-env e env))]
+ [(cdr-expr e) (cdr (eval-env e env))]
+ [(null-expr) null]
+ [(null?-expr e) (null? (eval-env e env))]
+ [(lam x e) (clo x e env)]
+ [(app f e)
+ (let ([vf (eval-env f env)]
+ [ve (eval-env e env)])
+ (match vf [(clo x body fun-env)
+ (eval-env body (env-add x ve (merge-let-vars env fun-env)))]))]))
+
+(define (merge-let-vars env1 env2)
+ (define (iter xs env)
+ (if (null? xs)
+ env
+ (let ((cur-var (car xs)))
+ (if (let-var? (mcdr cur-var))
+ (iter (cdr xs) (env-add (mcar cur-var) (mcdr cur-var) env))
+ (iter (cdr xs) env)))))
+ (iter (reverse (environ-xs env2)) env1))
+
+(define (eval e) (eval-env e env-empty))
+
+; ---------------------------------------------------------------- !!!
+
+(struct skip () #:transparent)
+(struct assign (x e) #:transparent)
+(struct if-cmd (eb ct cf) #:transparent)
+(struct while (eb cb) #:transparent)
+(struct comp (c1 c2) #:transparent)
+
+(define (cmd? c)
+ (match c
+ [(skip) true]
+ [(assign x e) (and (symbol? x) (expr? e))]
+ [(if-cmd eb ct cf) (and (expr? eb) (cmd? ct) (cmd? cf))]
+ [(while eb ct) (and (expr? eb) (cmd? ct))]
+ [else false]))
+
+(define (parse-while q)
+ (cond
+ [(eq? q 'skip) (skip)]
+ [(null? q) (skip)]
+ [(and (list? q) (= (length q) 3) (eq? (second q) ':=))
+ (assign (first q)
+ (parse (third q)))]
+ [(and (list? q) (= (length q) 4) (eq? (car q) 'if))
+ (if-cmd (parse (second q))
+ (parse-while (third q))
+ (parse-while (fourth q)))]
+ [(and (list? q) (= (length q) 3) (eq? (car q) 'while))
+ (while (parse (second q))
+ (parse-while (third q)))]
+ [(and (list? q) (= (length q) 2))
+ (comp (parse-while (first q))
+ (parse-while (second q)))]
+ [(and (list? q) (> (length q) 2))
+ (comp (parse-while (first q))
+ (parse-while (cdr q)))]
+ [else (error "while parse error")]))
+
+(define (eval-while e env)
+ (match e
+ [(skip) env]
+ [(assign x e)
+ (env-update x (eval-env e env) env)]
+ [(if-cmd eb ct cf)
+ (if (eval-env eb env)
+ (eval-while ct env)
+ (eval-while cf env))]
+ [(while eb cb)
+ (if (eval-env eb env)
+ (eval-while e (eval-while cb env))
+ env)]
+ [(comp c1 c2) (eval-while c2 (eval-while c1 env))]))
+
+; zakladamy, ze program startuje z pamiecia w ktorej
+; aktwna jest zmienna t
+(define WHILE_FACT
+ '{(i := 1)
+ (while (> t 0)
+ {(i := (* i t))
+ (t := (- t 1))})})
+
+(define (fact n)
+ (let* ([init-env (env-add 't n env-empty)]
+ [final-env
+ (eval-while (parse-while WHILE_FACT) init-env)])
+ (env-lookup 'i final-env)))
+
+(define prog1 '{(x := 5)
+ (f := (let [x 50] (lambda (y) (+ x y))))
+ (x := 10)
+ (z := (f 0))})
\ No newline at end of file diff --git a/Semestr 2/racket/leftist.rkt b/Semestr 2/racket/leftist.rkt new file mode 100644 index 0000000..78319e4 --- /dev/null +++ b/Semestr 2/racket/leftist.rkt @@ -0,0 +1,105 @@ +#lang racket + +(provide make-elem elem-priority elem-val empty-heap heap-insert heap-merge heap-min heap-pop heap-empty?) + +(define (inc n) + (+ n 1)) + +;;; tagged lists +(define (tagged-list? len-xs tag xs) + (and (list? xs) + (= len-xs (length xs)) + (eq? (first xs) tag))) + +;;; ordered elements +(define (make-elem pri val) + (cons pri val)) + +(define (elem-priority x) + (car x)) + +(define (elem-val x) + (cdr x)) + +;;; leftist heaps (after Okasaki) + +;; data representation +(define leaf 'leaf) + +(define (leaf? h) (eq? 'leaf h)) + +(define (hnode? h) + (and (tagged-list? 5 'hnode h) + (natural? (caddr h)))) + +(define (make-hnode elem heap-a heap-b) + (if (< (rank heap-a) (rank heap-b)) + (list 'hnode elem (+ (rank heap-a) 1) heap-b heap-a) + (list 'hnode elem (+ (rank heap-b) 1) heap-a heap-b))) + +(define (hnode-elem h) + (second h)) + +(define (hnode-left h) + (fourth h)) + +(define (hnode-right h) + (fifth h)) + +(define (hnode-rank h) + (third h)) + +(define (hord? p h) + (or (leaf? h) + (<= p (elem-priority (hnode-elem h))))) + +(define (heap? h) + (or (leaf? h) + (and (hnode? h) + (heap? (hnode-left h)) + (heap? (hnode-right h)) + (<= (rank (hnode-right h)) + (rank (hnode-left h))) + (= (rank h) (inc (rank (hnode-right h)))) + (hord? (elem-priority (hnode-elem h)) + (hnode-left h)) + (hord? (elem-priority (hnode-elem h)) + (hnode-right h))))) + +(define (rank h) + (if (leaf? h) + 0 + (hnode-rank h))) + +;; operations + +(define empty-heap leaf) + +(define (heap-empty? h) + (leaf? h)) + +(define (heap-insert elt heap) + (heap-merge heap (make-hnode elt leaf leaf))) + +(define (heap-min heap) + (hnode-elem heap)) + +(define (heap-pop heap) + (heap-merge (hnode-left heap) (hnode-right heap))) + +(define (heap-merge h1 h2) + (cond + [(leaf? h1) h2] + [(leaf? h2) h1] + [else (let ((h1-min (heap-min h1)) + (h2-min (heap-min h2))) + (if (< (elem-priority h1-min) (elem-priority h2-min)) + (make-hnode h1-min (heap-merge (hnode-left h1) (hnode-right h1)) h2) + (make-hnode h2-min h1 (heap-merge (hnode-left h2) (hnode-right h2)))))])) + +;;; check that a list is sorted (useful for longish lists) +(define (sorted? xs) + (cond [(null? xs) true] + [(null? (cdr xs)) true] + [(<= (car xs) (cadr xs)) (sorted? (cdr xs))] + [else false])) diff --git a/Semestr 2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep b/Semestr 2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep new file mode 100644 index 0000000..6e0cfbb --- /dev/null +++ b/Semestr 2/racket/lista5/compiled/drracket/errortrace/prop_rkt.dep @@ -0,0 +1 @@ +("7.6" racket ("f0a57e86828cdab35eaad454d5deb80353172518" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/Semestr 2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zo b/Semestr 2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zo Binary files differnew file mode 100644 index 0000000..748fec9 --- /dev/null +++ b/Semestr 2/racket/lista5/compiled/drracket/errortrace/prop_rkt.zo diff --git a/Semestr 2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep b/Semestr 2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep new file mode 100644 index 0000000..0926afc --- /dev/null +++ b/Semestr 2/racket/lista5/compiled/drracket/errortrace/props_rkt.dep @@ -0,0 +1 @@ +("7.6" racket ("e0347fa7e89f59bc97c197db02b440f666222428" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/Semestr 2/racket/lista5/compiled/drracket/errortrace/props_rkt.zo b/Semestr 2/racket/lista5/compiled/drracket/errortrace/props_rkt.zo Binary files differnew file mode 100644 index 0000000..eccc7f7 --- /dev/null +++ b/Semestr 2/racket/lista5/compiled/drracket/errortrace/props_rkt.zo diff --git a/Semestr 2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep b/Semestr 2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep new file mode 100644 index 0000000..9810b4c --- /dev/null +++ b/Semestr 2/racket/lista5/compiled/drracket/errortrace/solution_rkt.dep @@ -0,0 +1 @@ +("7.6" racket ("ae3a6974cdd4582f480927d9968aad2f495b7fc4" . "33b0c09c14dce6a2115d810ac3d0f25a9dce3205") #"C:\\Users\\franc\\Documents\\lista5\\props.rkt" (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/Semestr 2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zo b/Semestr 2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zo Binary files differnew file mode 100644 index 0000000..ca1ab20 --- /dev/null +++ b/Semestr 2/racket/lista5/compiled/drracket/errortrace/solution_rkt.zo diff --git a/Semestr 2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep b/Semestr 2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep new file mode 100644 index 0000000..0926afc --- /dev/null +++ b/Semestr 2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.dep @@ -0,0 +1 @@ +("7.6" racket ("e0347fa7e89f59bc97c197db02b440f666222428" . "8314027ed4c1c6fd9c412af77103e94790e59dd2") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/Semestr 2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zo b/Semestr 2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zo Binary files differnew file mode 100644 index 0000000..eccc7f7 --- /dev/null +++ b/Semestr 2/racket/lista5/julita/compiled/drracket/errortrace/props_rkt.zo diff --git a/Semestr 2/racket/lista5/julita/props.rkt b/Semestr 2/racket/lista5/julita/props.rkt new file mode 100644 index 0000000..204b108 --- /dev/null +++ b/Semestr 2/racket/lista5/julita/props.rkt @@ -0,0 +1,52 @@ +#lang racket + +(provide conj conj-left conj-right conj? + disj disj-left disj-right disj? + neg neg-subf neg? + var?) + + +(define (conj p q) + (list 'conj p q)) + +(define (conj-left f) + (second f)) + +(define (conj-right f) + (third f)) + +(define (conj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'conj (car t)))) + + +(define (disj p q) + (list 'disj p q)) + +(define (disj-left f) + (second f)) + +(define (disj-right f) + (third f)) + +(define (disj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'disj (car t)))) + + +(define (neg x) + (list 'neg x)) + +(define (neg-subf x) + (second x)) + +(define (neg? t) + (and (list? t) + (= 2 (length t)) + (eq? 'neg (car t)))) + + +(define (var? t) + (symbol? t)) diff --git a/Semestr 2/racket/lista5/julita/solution.bak b/Semestr 2/racket/lista5/julita/solution.bak new file mode 100644 index 0000000..b3dda94 --- /dev/null +++ b/Semestr 2/racket/lista5/julita/solution.bak @@ -0,0 +1,164 @@ +#lang racket + +;;Praca grupowa: +;;Dawid Holewa +;;Julita Osman +;;Aleksandra Stępniewska + +(require "props.rkt") +(provide falsifiable-cnf?) + +;Ponieważ formuła w cnf to konjunkcja klauzul +;a klauzula to alternatywa literałów +;to formuła w tej postaci jest tautologią +;wtedy i tylko wtedy gdy +;wszystkie klauzule w niej występujace sa zawsze prawdziwe (też są tautologiami) +;w przeciwnym razie, formulę taką da się zanegować; +;zatem nasz pomysł polega na tym, aby +;1)sprawdzic czy formula jest tautologia +;2)jesli tak to zwracamy fałsz +;3)wpp. pierwsza z klauzul, która nie jest tautologia +;(zatem jest mozliwa do zanegowania i jednocześnie neguje cała formułe w cnf) +;"przesuwamy" na początek listy reprezentującej cnf + +;dodatkowo to czy klauzula jest tautologią nie musimy sprawdzać wykonując wartościowanie +;możemy skorzystać z własności alternatywy +;klauzula bedzię zawsze pawdziwa tylko jeśli conajmniej jedna ze zmiennych występuje jednoczesnie ze swoją negacją + +;Falsifiable, która sprawdza każde wartościowania +;sprawdza 2^(ilosc zmiennych w całym wyrażeniu) wartosciowań, +;podczas gdy +;falsifiable, która opiera się na strukturze cnf +;przechodzi po cnf, aż do napotkania pierwszej +;mozliwej do zanegowania klauzuli +;zatem w najroszym przypadku przejdziemy po całym cnf +;ale zawsze wartosciowania negujacego formule szukamy tylko dla jedenej klauzuli +;zauważmy,ze jeśli formuła jest tautologią to oszczędzamy bardzo dużo czasu nie rozpartując wszystkich wartosciowań, tylko wypisujac odrazu falsz + +;Ta druga jest więc efektywniejsza + +(define (lit? f);; a lub ~a + (or (var? f) ;;a + (and (neg? f);;~a + (var? (neg-subf f))))) + +(define (lit-pos v) + v) + +(define (lit-neg v) + (neg v)) + +(define (lit-var l) ;;a-->a ~a-->a + (if (var? l) + l + (neg-subf l))) + +(define (lit-pos? l) + (var? l)) + +(define (to-nnf f) + (cond + [(var? f) (lit-pos f)] + [(neg? f) (to-nnf-neg (neg-subf f))] + [(conj? f) (conj (to-nnf (conj-left f)) + (to-nnf (conj-right f)))] + [(disj? f) (disj (to-nnf (disj-left f)) + (to-nnf (disj-right f)))])) + +(define (to-nnf-neg f) + (cond + [(var? f) (lit-neg f)] + [(neg? f) (to-nnf (neg-subf f))] + [(conj? f) (disj (to-nnf-neg (conj-left f)) + (to-nnf-neg (conj-right f)))] + [(disj? f) (conj (to-nnf-neg (disj-left f)) + (to-nnf-neg (disj-right f)))])) + +(define (mk-cnf xss) + (cons 'cnf xss)) + +(define (clause? f) + (and (list? f) + (andmap lit? f))) + +(define (cnf? f) + (and (pair? f) + (eq? 'cnf (car f)) + (list? (cdr f)) + (andmap clause? (cdr f)))) + +(define (to-cnf f) + (define (join xss yss) + (apply append (map (lambda (xs) (map (lambda (ys) (append xs ys)) yss)) xss))) + + (define (go f) + (cond + [(lit? f) (list (list f))] + [(conj? f) (append (go (conj-left f)) + (go (conj-right f)))] + [(disj? f) (join (go (disj-left f)) + (go (disj-right f)))])) + (mk-cnf (go f))) + + +(define (contain-both-literals? claus) + (define (aux to-check) + (cond [(empty? to-check) #f] + [(neg? (car to-check)) + (if (memq (neg-subf (car to-check)) claus) + #t + (aux (cdr to-check)))] + [else (aux (cdr to-check))])) + (aux claus)) + + +;; sprawdza czy ktorakolwiek z klauzul z listy reprezentujacej cnf +;; zawiera chociaz jedną parę zmiennej i jej negacji +;; zwraca liste pusta jesli cnf jest tautologia +;; zwraca liste z pierwsza klauzule nie bedaca tautologia "przesunieta" na poczatek (possible-to-neg) +(define (has-both big-set) + (define (possible-to-neg big-set x) ;;przesuwa x-ty element listy big-set na poczatek + (define x-ty (list-ref big-set x)) + (append (list x-ty) (remove x-ty big-set))) + (define (aux iter big-set) + (if (= iter (length big-set)) + '() + (if (contain-both-literals? (list-ref big-set iter)) ;;sprawdzamy czy iter klauzula cnf ma wystapienie a i ~a jednoczesnie + (aux (+ iter 1) big-set) + (possible-to-neg big-set iter)))) + (aux 0 (cdr big-set))) ;;(cdr big-set) bo to cnf czyli pierwszy element listy to edykieta 'cnf + + +(define (falsifiable-cnf? t) + (define tt (to-cnf (to-nnf t))) + (define f (has-both tt)) + (if (empty? f) + #f + (find-valuation f))) + + +(define (valuate f sigma) + (define (insigma-proc lista result) + (cond [(null? lista) result] + [(insigma-proc (cdr lista) (append result (list (lit-var(caar lista)))))])) + ;; insigma ---> lista zmiennych z wartosciowania pierwszej klauzuli: + (define insigma (insigma-proc sigma '())) + (define (aux insigma otherclause sigma) + (cond [(null? otherclause) sigma] + [(if (memq (lit-var (car otherclause)) insigma) + (aux insigma (cdr otherclause) sigma) + (if(neg? (car otherclause)) + (aux (append insigma (list(car otherclause))) + (cdr otherclause) + (append sigma (list(list (lit-var(car otherclause)) 1)))) + (aux (append insigma (list(car otherclause))) + (cdr otherclause) + (append sigma (list(list (car otherclause) 0))))))])) + (if (empty? f) + sigma + (valuate (cdr f) + (aux insigma (car f) sigma)))) + +(define (find-valuation f) + (valuate f '())) + diff --git a/Semestr 2/racket/lista5/julita/solution.rkt b/Semestr 2/racket/lista5/julita/solution.rkt new file mode 100644 index 0000000..da87bf9 --- /dev/null +++ b/Semestr 2/racket/lista5/julita/solution.rkt @@ -0,0 +1,164 @@ +#lang racket + +;;Praca grupowa: +;;Dawid Holewa +;;Julita Osman +;;Aleksandra Stępniewska + +(require "props.rkt") +(provide falsifiable-cnf?) + +;Ponieważ formuła w cnf to konjunkcja klauzul +;a klauzula to alternatywa literałów +;to formuła w tej postaci jest tautologią +;wtedy i tylko wtedy gdy +;wszystkie klauzule w niej występujace sa zawsze prawdziwe (też są tautologiami) +;w przeciwnym razie, formulę taką da się zanegować; +;zatem nasz pomysł polega na tym, aby +;1)sprawdzic czy formula jest tautologia +;2)jesli tak to zwracamy fałsz +;3)wpp. pierwsza z klauzul, która nie jest tautologia +;(zatem jest mozliwa do zanegowania i jednocześnie neguje cała formułe w cnf) +;"przesuwamy" na początek listy reprezentującej cnf + +;dodatkowo to czy klauzula jest tautologią nie musimy sprawdzać wykonując wartościowanie +;możemy skorzystać z własności alternatywy +;klauzula bedzię zawsze pawdziwa tylko jeśli conajmniej jedna ze zmiennych występuje jednoczesnie ze swoją negacją + +;Falsifiable, która sprawdza każde wartościowania +;sprawdza 2^(ilosc zmiennych w całym wyrażeniu) wartosciowań, +;podczas gdy +;falsifiable, która opiera się na strukturze cnf +;przechodzi po cnf, aż do napotkania pierwszej +;mozliwej do zanegowania klauzuli +;zatem w najroszym przypadku przejdziemy po całym cnf +;ale zawsze wartosciowania negujacego formule szukamy tylko dla jedenej klauzuli +;zauważmy,ze jeśli formuła jest tautologią to oszczędzamy bardzo dużo czasu nie rozpartując wszystkich wartosciowań, tylko wypisujac odrazu falsz + +;Ta druga jest więc efektywniejsza + +(define (lit? f);; a lub ~a + (or (var? f) ;;a + (and (neg? f);;~a + (var? (neg-subf f))))) + +(define (lit-pos v) + v) + +(define (lit-neg v) + (neg v)) + +(define (lit-var l) ;;a-->a ~a-->a + (if (var? l) + l + (neg-subf l))) + +(define (lit-pos? l) + (var? l)) + +(define (to-nnf f) + (cond + [(var? f) (lit-pos f)] + [(neg? f) (to-nnf-neg (neg-subf f))] + [(conj? f) (conj (to-nnf (conj-left f)) + (to-nnf (conj-right f)))] + [(disj? f) (disj (to-nnf (disj-left f)) + (to-nnf (disj-right f)))])) + +(define (to-nnf-neg f) + (cond + [(var? f) (lit-neg f)] + [(neg? f) (to-nnf (neg-subf f))] + [(conj? f) (disj (to-nnf-neg (conj-left f)) + (to-nnf-neg (conj-right f)))] + [(disj? f) (conj (to-nnf-neg (disj-left f)) + (to-nnf-neg (disj-right f)))])) + +(define (mk-cnf xss) + (cons 'cnf xss)) + +(define (clause? f) + (and (list? f) + (andmap lit? f))) + +(define (cnf? f) + (and (pair? f) + (eq? 'cnf (car f)) + (list? (cdr f)) + (andmap clause? (cdr f)))) + +(define (to-cnf f) + (define (join xss yss) + (apply append (map (lambda (xs) (map (lambda (ys) (append xs ys)) yss)) xss))) + + (define (go f) + (cond + [(lit? f) (list (list f))] + [(conj? f) (append (go (conj-left f)) + (go (conj-right f)))] + [(disj? f) (join (go (disj-left f)) + (go (disj-right f)))])) + (mk-cnf (go f))) + + +(define (contain-both-literals? claus) + (define (aux to-check) + (cond [(empty? to-check) #f] + [(neg? (car to-check)) + (if (memq (neg-subf (car to-check)) claus) + #t + (aux (cdr to-check)))] + [else (aux (cdr to-check))])) + (aux claus)) + + +;; sprawdza czy ktorakolwiek z klauzul z listy reprezentujacej cnf +;; zawiera chociaz jedną parę zmiennej i jej negacji +;; zwraca liste pusta jesli cnf jest tautologia +;; zwraca liste z pierwsza klauzule nie bedaca tautologia "przesunieta" na poczatek (possible-to-neg) +(define (has-both big-set) + (define (possible-to-neg big-set x) ;;przesuwa x-ty element listy big-set na poczatek + (define x-ty (list-ref big-set x)) + (append (list x-ty) (remove x-ty big-set))) + (define (aux iter big-set) + (if (= iter (length big-set)) + '() + (if (contain-both-literals? (list-ref big-set iter)) ;;sprawdzamy czy iter klauzula cnf ma wystapienie a i ~a jednoczesnie + (aux (+ iter 1) big-set) + (possible-to-neg big-set iter)))) + (aux 0 (cdr big-set))) ;;(cdr big-set) bo to cnf czyli pierwszy element listy to edykieta 'cnf + + +(define (falsifiable-cnf? t) + (define tt (to-cnf (to-nnf t))) + (define f (has-both tt)) + (if (empty? f) + #f + (find-valuation f))) + + +(define (valuate f sigma) + (define (insigma-proc lista result) + (cond [(null? lista) result] + [(insigma-proc (cdr lista) (append result (list (lit-var(caar lista)))))])) + ;; insigma ---> lista zmiennych z wartosciowania pierwszej klauzuli: + (define insigma (insigma-proc sigma '())) + (define (aux insigma otherclause sigma) + (cond [(null? otherclause) sigma] + [(if (memq (lit-var (car otherclause)) insigma) + (aux insigma (cdr otherclause) sigma) + (if(neg? (car otherclause)) + (aux (append insigma (list(car otherclause))) + (cdr otherclause) + (append sigma (list(list (lit-var(car otherclause)) true)))) + (aux (append insigma (list(car otherclause))) + (cdr otherclause) + (append sigma (list(list (car otherclause) false))))))])) + (if (empty? f) + sigma + (valuate (cdr f) + (aux insigma (car f) sigma)))) + +(define (find-valuation f) + (valuate f '())) + diff --git a/Semestr 2/racket/lista5/prop.rkt b/Semestr 2/racket/lista5/prop.rkt new file mode 100644 index 0000000..6f1f7b4 --- /dev/null +++ b/Semestr 2/racket/lista5/prop.rkt @@ -0,0 +1 @@ +#lang racket diff --git a/Semestr 2/racket/lista5/props.bak b/Semestr 2/racket/lista5/props.bak new file mode 100644 index 0000000..1a5659a --- /dev/null +++ b/Semestr 2/racket/lista5/props.bak @@ -0,0 +1,71 @@ +#lang racket + +(provide var? + neg? + conj? + disj? + conj + disj + neg + conj-left + conj-right + disj-right + disj-left + neg-subf) +; (require "solution.rkt") + +(define (var? t) (symbol? t)) + +(define (neg? t) + (and (list? t) + (= 2 (length t)) + (eq? 'neg (car t)))) + +(define (conj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'conj (car t)))) + +(define (disj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'disj (car t)))) + +(define (lit? t) + (or (var? t) + (and (neg? t) + (var? (neg-subf t))))) + +(define (conj left right) + (list 'conj left right)) + +(define (disj left right) + (list 'disj left right)) + +(define (neg f) + (list 'neg f)) + +(define (conj-left f) + (if (conj? f) + (cadr f) + (error "Złe dane ze znacznikiem -- CONJ-LEFT" f))) + +(define (conj-right f) + (if (conj? f) + (caddr f) + (error "Złe dane ze znacznikiem -- CONJ-RIGHT" f))) + +(define (disj-left f) + (if (disj? f) + (cadr f) + (error "Złe dane ze znacznikiem -- DISJ-LEFT" f))) + +(define (disj-right f) + (if (disj? f) + (caddr f) + (error "Złe dane ze znacznikiem -- DISJ-RIGHT" f))) + +(define (neg-subf f) + (if (neg? f) + (cadr f) + (error "Złe dane ze znacznikiem -- NEG-FORM" f))) diff --git a/Semestr 2/racket/lista5/props.rkt b/Semestr 2/racket/lista5/props.rkt new file mode 100644 index 0000000..204b108 --- /dev/null +++ b/Semestr 2/racket/lista5/props.rkt @@ -0,0 +1,52 @@ +#lang racket + +(provide conj conj-left conj-right conj? + disj disj-left disj-right disj? + neg neg-subf neg? + var?) + + +(define (conj p q) + (list 'conj p q)) + +(define (conj-left f) + (second f)) + +(define (conj-right f) + (third f)) + +(define (conj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'conj (car t)))) + + +(define (disj p q) + (list 'disj p q)) + +(define (disj-left f) + (second f)) + +(define (disj-right f) + (third f)) + +(define (disj? t) + (and (list? t) + (= 3 (length t)) + (eq? 'disj (car t)))) + + +(define (neg x) + (list 'neg x)) + +(define (neg-subf x) + (second x)) + +(define (neg? t) + (and (list? t) + (= 2 (length t)) + (eq? 'neg (car t)))) + + +(define (var? t) + (symbol? t)) diff --git a/Semestr 2/racket/lista5/skrr/solution.bak b/Semestr 2/racket/lista5/skrr/solution.bak new file mode 100644 index 0000000..72c7f36 --- /dev/null +++ b/Semestr 2/racket/lista5/skrr/solution.bak @@ -0,0 +1,135 @@ +#lang racket + +(provide falsifiable-cnf?) +(require "props.rkt") + +(define (prop? f) + (or (var? f) + (and (neg? f) + (prop? (neg-subf f))) + (and (disj? f) + (prop? (disj-left f)) + (prop? (disj-right f))) + (and (conj? f) + (prop? (conj-left f)) + (prop? (conj-right f))))) + +(define (lit-var f) + (cond [(var? f) f] + [(neg? f) (neg-subf f)] + [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)])) + +(define (free-vars f) + (cond [(null? f) null] + [(var? f) (list f)] + [(neg? f) (free-vars (neg-subf f))] + [(conj? f) (append (free-vars (conj-left f)) + (free-vars (conj-right f)))] + [(disj? f) (append (free-vars (disj-left f)) + (free-vars (disj-right f)))] + [else (error "Zła formula -- FREE-VARS" f)])) + +(define (gen-vals xs) + (if (null? xs) + (list null) + (let* + ((vss (gen-vals (cdr xs))) + (x (car xs)) + (vst (map (λ (vs) (cons (list x true) vs)) vss)) + (vsf (map (λ (vs) (cons (list x false) vs)) vss))) + (append vst vsf)))) + +(define (eval-formula f evaluation) + (cond [(var? f) + (let ((val (assoc f evaluation))) + (if (not val) + (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation) + (cadr val)))] + [(neg? f) (not (eval-formula (neg-subf f) evaluation))] + [(disj? f) (or (eval-formula (disj-left f) evaluation) + (eval-formula (disj-right f) evaluation))] + [(conj? f) (and (eval-formula (conj-left f) evaluation) + (eval-formula (conj-right f) evaluation))] + [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)])) + +(define (falsifiable-eval? f) + (let* ((evaluations (gen-vals (free-vars f))) + (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations))) + (ormap false? results))) + +(define (nff? f) + (cond [(lit? f) true] + [(neg? f) false] + [(conj? f) (and (nff? (conj-left f)) + (nff? (conj-right f)))] + [(disj? f) (and (nff? (disj-left f)) + (nff? (disj-right f)))] + [else (error "Zła formuła -- NFF?" f)])) + +(define (convert-to-nnf f) + (cond [(lit? f) f] + [(neg? f) (convert-negation (neg-subf f))] + [(conj? f) (conj (convert-to-nnf (conj-left f)) + (convert-to-nnf (conj-right f)))] + [(disj? f) (disj (convert-to-nnf (disj-left f)) + (convert-to-nnf (disj-right f)))] + [else (error "Zła formuła -- CONVERT" f)])) + +(define (convert-negation f) + (cond [(lit? f) + (if (var? f) + (neg f) + (neg-subf f))] + [(neg? f) (convert-to-nnf (neg-subf f))] + [(conj? f) (disj (convert-negation (conj-left f)) + (convert-negation (conj-right f)))] + [(disj? f) (conj (convert-negation (disj-left f)) + (convert-negation (disj-right f)))] + [else (error "Zła formuła -- CONVERT-NEGATION" f)])) + +(define (clause? x) + (and (list? x) + (andmap lit? x))) + +(define (clause-empty? x) + (and (clause? x) + (null? x))) + +(define (cnf? x) + (and (list? x) + (andmap clause? x))) + +(define (flatmap proc seq) + (foldl append null (map proc seq))) + +(define (convert-to-cnf f) + (define (convert f) + (cond [(lit? f) (list (list f))] + [(conj? f) (append (convert-to-cnf (conj-left f)) + (convert-to-cnf (conj-right f)))] + [(disj? f) + (let ((clause-left (convert-to-cnf (disj-left f))) + (clause-right (convert-to-cnf (disj-right f)))) + (flatmap (λ (clause) + (map (λ (clause2) + (append clause2 clause)) clause-left)) + clause-right))])) + (convert (convert-to-nnf f))) + +(define (falsifiable-clause? clause) + (cond [(clause-empty? clause) true] + [(lit? (findf (λ (l) (equal? + l + (convert-to-nnf (neg (car clause))))) + clause)) false] + [else (falsifiable-clause? (cdr clause))])) + +(define (falsifiable-cnf? f) + (define (neg-value lit) + (if (var? lit) + (list lit false) + (list (neg-subf lit) true))) + (ormap (λ (clause) (if (falsifiable-clause? clause) + (map neg-value clause) + false)) + (convert-to-cnf f)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista5/skrr/solution.rkt b/Semestr 2/racket/lista5/skrr/solution.rkt new file mode 100644 index 0000000..e8efbc9 --- /dev/null +++ b/Semestr 2/racket/lista5/skrr/solution.rkt @@ -0,0 +1,88 @@ +#lang racket + +(require "props.rkt") +(provide falsifiable-cnf?) + +(define (lit? f) + (or (var? f) + (and (neg? f) + (var? (neg-subf f))))) + +(define (lit-pos v) + v) + +(define (lit-neg v) + (neg v)) + +(define (lit-var l) + (if (var? l) + l + (neg-subf l))) + +(define (lit-pos? l) + (var? l)) + +(define (to-nnf f) + (cond + [(var? f) (lit-pos f)] + [(neg? f) (to-nnf-neg (neg-subf f))] + [(conj? f) (conj (to-nnf (conj-left f)) + (to-nnf (conj-right f)))] + [(disj? f) (disj (to-nnf (disj-left f)) + (to-nnf (disj-right f)))])) + +(define (to-nnf-neg f) + (cond + [(var? f) (lit-neg f)] + [(neg? f) (to-nnf (neg-subf f))] + [(conj? f) (disj (to-nnf-neg (conj-left f)) + (to-nnf-neg (conj-right f)))] + [(disj? f) (conj (to-nnf-neg (disj-left f)) + (to-nnf-neg (disj-right f)))])) + +(define (mk-cnf xss) + (cons 'cnf xss)) + +(define (clause? f) + (and (list? f) + (andmap lit? f))) + +(define (cnf? f) + (and (pair? f) + (eq? 'cnf (car f)) + (list? (cdr f)) + (andmap clause? (cdr f)))) + +(define (to-cnf f) + (define (join xss yss) + (apply append (map (lambda (xs) (map (lambda (ys) (append xs ys)) yss)) xss))) + (define (go f) + (cond + [(lit? f) (list (list f))] + [(conj? f) (append (go (conj-left f)) + (go (conj-right f)))] + [(disj? f) (join (go (disj-left f)) + (go (disj-right f)))])) + (mk-cnf (go f))) + +(define (clause-empty? x) + (and (clause? x) + (null? x))) + +(define (falsifiable-clause? clause) + (cond [(clause-empty? clause) true] + [(lit? (findf (λ (l) (equal? + l + (to-nnf (neg (car clause))))) + clause)) false] + [else (falsifiable-clause? (cdr clause))])) + +(define (falsifiable-cnf? f) + (define (neg-value lit) + (if (var? lit) + (list lit false) + (list (neg-subf lit) true))) + (ormap (λ (clause) (if (falsifiable-clause? clause) + (map neg-value clause) + false)) + (convert-to-cnf f)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista5/sol2.rkt b/Semestr 2/racket/lista5/sol2.rkt new file mode 100644 index 0000000..d037472 --- /dev/null +++ b/Semestr 2/racket/lista5/sol2.rkt @@ -0,0 +1,90 @@ +#lang racket +(provide falsifiable-cnf?) (require "props.rkt") + + +(define (falsifiable-cnf? p) + ;literał + (define (lit? p) + (or (var? p) + (and (neg? p) (var? (neg-subf p))) + )) + + (define (lit-pos? p) + (if (lit? p) + (var? p) + (error "not a literal" p) + )) + + (define (lit-var p) + (cond + [(not (lit? p)) (error "not a literal" p)] + [(lit-pos? p) p] + [else (neg-subf p)] + )) + + (define (contr p) + (if (lit? p) + (if (neg? p) (neg-subf p) (neg p)) + (error "not a literal" p) + )) + + ;konwertowanie + (define (convert-to-cnf p) + (define (convert-to-nnf p) + (cond + [(lit? p) p] + [(and (neg? p) (conj? (neg-subf p))) + (let ((A (neg-subf p))) + (disj (convert-to-nnf (neg (conj-left A))) (convert-to-nnf (neg (conj-right A)))))] + [(and (neg? p) (disj? (neg-subf p))) + (let ((A (neg-subf p))) + (conj (convert-to-nnf (neg (disj-left A))) (convert-to-nnf (neg (disj-right A)))))] + [(and (neg? p) (neg? (neg-subf p))) (convert-to-nnf (neg-subf (neg-subf p)))] + [(conj? p) (conj (convert-to-nnf (conj-right p)) (convert-to-nnf (conj-left p)))] + [(disj? p) (disj (convert-to-nnf (disj-right p)) (convert-to-nnf (disj-left p)))] + [else (error "not a proposition" p)])) + + (define (flatmap proc seq) + (foldr append null (map proc seq))) + + (define (merge a b) + (flatmap (lambda (c) (map (lambda (c2) (append c c2)) b)) a)) + + (define (convert p) + (cond + [(lit? p) (list (list p))] + [(conj? p) (append (convert (conj-left p)) (convert (conj-right p)))] + [(disj? p) (let* ((L (convert (disj-left p))) (R (convert (disj-right p)))) + (merge L R))] + [else (error "it should never be here" p)] + )) + + (map (lambda (c) (remove-duplicates c)) (convert (convert-to-nnf p)))) + + ;prawdziwa funkcja + (define cnf (convert-to-cnf p)) + + (define (falsifiable-clause? c) + (cond + [(null? c) #t] + [(eq? #f (member (contr (car c)) c)) (falsifiable-clause? (cdr c))] + [else #f] + )) + + (define (falsified-clause c) + (if (null? c) + null + (cons (list (lit-var (car c)) (not (lit-pos? (car c)))) (falsified-clause (cdr c))) + )) + + (define (falsified-val p) + (cond + [(null? p) false] + [(falsifiable-clause? (car p)) (falsified-clause (car p))] + [else (falsified-val (cdr p))] + ) + ) + (falsified-val cnf)) + + +;złożoność wykładnicza tak jak falsible-eval ale często w praktyce szybsza jak nie ma za dużo alternatyw.
\ No newline at end of file diff --git a/Semestr 2/racket/lista5/solution.bak b/Semestr 2/racket/lista5/solution.bak new file mode 100644 index 0000000..72c7f36 --- /dev/null +++ b/Semestr 2/racket/lista5/solution.bak @@ -0,0 +1,135 @@ +#lang racket + +(provide falsifiable-cnf?) +(require "props.rkt") + +(define (prop? f) + (or (var? f) + (and (neg? f) + (prop? (neg-subf f))) + (and (disj? f) + (prop? (disj-left f)) + (prop? (disj-right f))) + (and (conj? f) + (prop? (conj-left f)) + (prop? (conj-right f))))) + +(define (lit-var f) + (cond [(var? f) f] + [(neg? f) (neg-subf f)] + [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)])) + +(define (free-vars f) + (cond [(null? f) null] + [(var? f) (list f)] + [(neg? f) (free-vars (neg-subf f))] + [(conj? f) (append (free-vars (conj-left f)) + (free-vars (conj-right f)))] + [(disj? f) (append (free-vars (disj-left f)) + (free-vars (disj-right f)))] + [else (error "Zła formula -- FREE-VARS" f)])) + +(define (gen-vals xs) + (if (null? xs) + (list null) + (let* + ((vss (gen-vals (cdr xs))) + (x (car xs)) + (vst (map (λ (vs) (cons (list x true) vs)) vss)) + (vsf (map (λ (vs) (cons (list x false) vs)) vss))) + (append vst vsf)))) + +(define (eval-formula f evaluation) + (cond [(var? f) + (let ((val (assoc f evaluation))) + (if (not val) + (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation) + (cadr val)))] + [(neg? f) (not (eval-formula (neg-subf f) evaluation))] + [(disj? f) (or (eval-formula (disj-left f) evaluation) + (eval-formula (disj-right f) evaluation))] + [(conj? f) (and (eval-formula (conj-left f) evaluation) + (eval-formula (conj-right f) evaluation))] + [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)])) + +(define (falsifiable-eval? f) + (let* ((evaluations (gen-vals (free-vars f))) + (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations))) + (ormap false? results))) + +(define (nff? f) + (cond [(lit? f) true] + [(neg? f) false] + [(conj? f) (and (nff? (conj-left f)) + (nff? (conj-right f)))] + [(disj? f) (and (nff? (disj-left f)) + (nff? (disj-right f)))] + [else (error "Zła formuła -- NFF?" f)])) + +(define (convert-to-nnf f) + (cond [(lit? f) f] + [(neg? f) (convert-negation (neg-subf f))] + [(conj? f) (conj (convert-to-nnf (conj-left f)) + (convert-to-nnf (conj-right f)))] + [(disj? f) (disj (convert-to-nnf (disj-left f)) + (convert-to-nnf (disj-right f)))] + [else (error "Zła formuła -- CONVERT" f)])) + +(define (convert-negation f) + (cond [(lit? f) + (if (var? f) + (neg f) + (neg-subf f))] + [(neg? f) (convert-to-nnf (neg-subf f))] + [(conj? f) (disj (convert-negation (conj-left f)) + (convert-negation (conj-right f)))] + [(disj? f) (conj (convert-negation (disj-left f)) + (convert-negation (disj-right f)))] + [else (error "Zła formuła -- CONVERT-NEGATION" f)])) + +(define (clause? x) + (and (list? x) + (andmap lit? x))) + +(define (clause-empty? x) + (and (clause? x) + (null? x))) + +(define (cnf? x) + (and (list? x) + (andmap clause? x))) + +(define (flatmap proc seq) + (foldl append null (map proc seq))) + +(define (convert-to-cnf f) + (define (convert f) + (cond [(lit? f) (list (list f))] + [(conj? f) (append (convert-to-cnf (conj-left f)) + (convert-to-cnf (conj-right f)))] + [(disj? f) + (let ((clause-left (convert-to-cnf (disj-left f))) + (clause-right (convert-to-cnf (disj-right f)))) + (flatmap (λ (clause) + (map (λ (clause2) + (append clause2 clause)) clause-left)) + clause-right))])) + (convert (convert-to-nnf f))) + +(define (falsifiable-clause? clause) + (cond [(clause-empty? clause) true] + [(lit? (findf (λ (l) (equal? + l + (convert-to-nnf (neg (car clause))))) + clause)) false] + [else (falsifiable-clause? (cdr clause))])) + +(define (falsifiable-cnf? f) + (define (neg-value lit) + (if (var? lit) + (list lit false) + (list (neg-subf lit) true))) + (ormap (λ (clause) (if (falsifiable-clause? clause) + (map neg-value clause) + false)) + (convert-to-cnf f)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista5/solution.rkt b/Semestr 2/racket/lista5/solution.rkt new file mode 100644 index 0000000..67964d8 --- /dev/null +++ b/Semestr 2/racket/lista5/solution.rkt @@ -0,0 +1,140 @@ +#lang racket + +(provide falsifiable-cnf?) +(require "props.rkt") + +(define (prop? f) + (or (var? f) + (and (neg? f) + (prop? (neg-subf f))) + (and (disj? f) + (prop? (disj-left f)) + (prop? (disj-right f))) + (and (conj? f) + (prop? (conj-left f)) + (prop? (conj-right f))))) + +(define (lit? t) + (or (var? t) + (and (neg? t) + (var? (neg-subf t))))) + +(define (lit-var f) + (cond [(var? f) f] + [(neg? f) (neg-subf f)] + [else (error "Złe dane ze znacznikiem -- LIT-VAR" f)])) + +(define (free-vars f) + (cond [(null? f) null] + [(var? f) (list f)] + [(neg? f) (free-vars (neg-subf f))] + [(conj? f) (append (free-vars (conj-left f)) + (free-vars (conj-right f)))] + [(disj? f) (append (free-vars (disj-left f)) + (free-vars (disj-right f)))] + [else (error "Zła formula -- FREE-VARS" f)])) + +(define (gen-vals xs) + (if (null? xs) + (list null) + (let* + ((vss (gen-vals (cdr xs))) + (x (car xs)) + (vst (map (λ (vs) (cons (list x true) vs)) vss)) + (vsf (map (λ (vs) (cons (list x false) vs)) vss))) + (append vst vsf)))) + +(define (eval-formula f evaluation) + (cond [(var? f) + (let ((val (assoc f evaluation))) + (if (not val) + (error "Zmienna wolna nie wystepuje w wartościowaniu -- EVAL-FORMULA" f evaluation) + (cadr val)))] + [(neg? f) (not (eval-formula (neg-subf f) evaluation))] + [(disj? f) (or (eval-formula (disj-left f) evaluation) + (eval-formula (disj-right f) evaluation))] + [(conj? f) (and (eval-formula (conj-left f) evaluation) + (eval-formula (conj-right f) evaluation))] + [else (error "Zła formuła -- EVAL-FORMULA" f evaluation)])) + +(define (falsifiable-eval? f) + (let* ((evaluations (gen-vals (free-vars f))) + (results (map (λ (evaluation) (eval-formula f evaluation)) evaluations))) + (ormap false? results))) + +(define (nff? f) + (cond [(lit? f) true] + [(neg? f) false] + [(conj? f) (and (nff? (conj-left f)) + (nff? (conj-right f)))] + [(disj? f) (and (nff? (disj-left f)) + (nff? (disj-right f)))] + [else (error "Zła formuła -- NFF?" f)])) + +(define (convert-to-nnf f) + (cond [(lit? f) f] + [(neg? f) (convert-negation (neg-subf f))] + [(conj? f) (conj (convert-to-nnf (conj-left f)) + (convert-to-nnf (conj-right f)))] + [(disj? f) (disj (convert-to-nnf (disj-left f)) + (convert-to-nnf (disj-right f)))] + [else (error "Zła formuła -- CONVERT" f)])) + +(define (convert-negation f) + (cond [(lit? f) + (if (var? f) + (neg f) + (neg-subf f))] + [(neg? f) (convert-to-nnf (neg-subf f))] + [(conj? f) (disj (convert-negation (conj-left f)) + (convert-negation (conj-right f)))] + [(disj? f) (conj (convert-negation (disj-left f)) + (convert-negation (disj-right f)))] + [else (error "Zła formuła -- CONVERT-NEGATION" f)])) + +(define (clause? x) + (and (list? x) + (andmap lit? x))) + +(define (clause-empty? x) + (and (clause? x) + (null? x))) + +(define (cnf? x) + (and (list? x) + (andmap clause? x))) + +(define (flatmap proc seq) + (foldl append null (map proc seq))) + +(define (convert-to-cnf f) + (define (convert f) + (cond [(lit? f) (list (list f))] + [(conj? f) (append (convert-to-cnf (conj-left f)) + (convert-to-cnf (conj-right f)))] + [(disj? f) + (let ((clause-left (convert-to-cnf (disj-left f))) + (clause-right (convert-to-cnf (disj-right f)))) + (flatmap (λ (clause) + (map (λ (clause2) + (append clause2 clause)) clause-left)) + clause-right))])) + (map (lambda (clause) (remove-duplicates clause)) (convert (convert-to-nnf f)))) + +(define (falsifiable-clause? clause) + (cond [(clause-empty? clause) true] + [(lit? (findf (λ (l) (equal? + l + (convert-to-nnf (neg (car clause))))) + clause)) false] + [else (falsifiable-clause? (cdr clause))])) + +(define (falsifiable-cnf? f) + (define (neg-value lit) + (if (var? lit) + (list lit false) + (list (neg-subf lit) true))) + (ormap (λ (clause) (if (falsifiable-clause? clause) + (map neg-value clause) + false)) + (convert-to-cnf f)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista5/xd.bak b/Semestr 2/racket/lista5/xd.bak new file mode 100644 index 0000000..d814e10 --- /dev/null +++ b/Semestr 2/racket/lista5/xd.bak @@ -0,0 +1,4 @@ +#lang racket + +(require "solution.rkt") + diff --git a/Semestr 2/racket/lista5/xd.rkt b/Semestr 2/racket/lista5/xd.rkt new file mode 100644 index 0000000..64ce78c --- /dev/null +++ b/Semestr 2/racket/lista5/xd.rkt @@ -0,0 +1,4 @@ +#lang racket + +(require "solution.rkt") +(require "props.rkt") diff --git a/Semestr 2/racket/lista6/lista8/kappa.py b/Semestr 2/racket/lista6/lista8/kappa.py new file mode 100644 index 0000000..f359d5c --- /dev/null +++ b/Semestr 2/racket/lista6/lista8/kappa.py @@ -0,0 +1,13 @@ +import pylab
+
+a = int(input("podaj liczbe: "))
+b = int(input("podaj liczbe: "))
+
+x = range(-10, 11)
+y = []
+for i in x:
+ y.append(a * i + b)
+pylab.plot(x, y)
+pylab.title('Wykres f(x) = a*x - b')
+pylab.grid(True)
+pylab.show()
diff --git a/Semestr 2/racket/lista6/lista8/zad1.bak b/Semestr 2/racket/lista6/lista8/zad1.bak new file mode 100644 index 0000000..0960f21 --- /dev/null +++ b/Semestr 2/racket/lista6/lista8/zad1.bak @@ -0,0 +1,98 @@ +#lang racket + +; Do let-env.rkt dodajemy wartosci boolowskie +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] ; <----------------- !!! + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) ; <--------------------------------------- !!! + (and (expr? eb) (expr? et) (expr? ef))] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] ; <---------------------------- !!! + [(eq? q 'false) (const false)] ; <---------------------------- !!! + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) ; <--- !!! + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(define (value? v) + (or (number? v) (boolean? v))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] ; <----------- !!! + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!! + (eval-env et env) + (eval-env ef env))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(if (or (< (% 123 10) 5) + true) + (+ 2 3) + (/ 2 0))) + +(define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/lista8/zad1.rkt b/Semestr 2/racket/lista6/lista8/zad1.rkt new file mode 100644 index 0000000..1cd6b0b --- /dev/null +++ b/Semestr 2/racket/lista6/lista8/zad1.rkt @@ -0,0 +1,104 @@ +#lang racket + +; Do let-env.rkt dodajemy wartosci boolowskie +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] ; <----------------- !!! + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) ; <--------------------------------------- !!! + (and (expr? eb) (expr? et) (expr? ef))] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] ; <---------------------------- !!! + [(eq? q 'false) (const false)] ; <---------------------------- !!! + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) ; <--- !!! + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'and)) + (if-expr (parse (second q)) + (parse (third q)) + (const false))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'or)) + (if-expr (parse (second q)) + (const true) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(define (value? v) + (or (number? v) (boolean? v))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] ; <----------- !!! + ['= =] ['> >] ['>= >=] ['< <] ['<= <=])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!! + (eval-env et env) + (eval-env ef env))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(if (or (< (% 123 10) 5) + true) + (+ 2 3) + (/ 2 0))) + +(define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/lista8/zad4.bak b/Semestr 2/racket/lista6/lista8/zad4.bak new file mode 100644 index 0000000..503099d --- /dev/null +++ b/Semestr 2/racket/lista6/lista8/zad4.bak @@ -0,0 +1,114 @@ +#lang racket + +; Do boolean.rkt dodajemy pary +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) ; <------------------- !!! +(struct car-expr (e) #:transparent) ; <------------------- !!! +(struct cdr-expr (e) #:transparent) ; <------------------- !!! + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] ; <----------- !!! + [(car-expr e) (expr? e)] ; <---------------------------------- !!! + [(cdr-expr e) (expr? e)] ; <---------------------------------- !!! + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) ; <- !!! + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) ; <-- !!! + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) ; <-- !!! + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) ; <---------------- !!! + (eval-env e2 env))] + [(car-expr e) (car (eval-env e env))] ; <--------------------- !!! + [(cdr-expr e) (cdr (eval-env e env))])) ; <------------------- !!! + +(define (eval e) (eval-env e env-empty)) + +(define program + '(car (if true (cons 1 2) false))) + +(define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/lista8/zad4.rkt b/Semestr 2/racket/lista6/lista8/zad4.rkt new file mode 100644 index 0000000..7934435 --- /dev/null +++ b/Semestr 2/racket/lista6/lista8/zad4.rkt @@ -0,0 +1,118 @@ +#lang racket + +; Do boolean.rkt dodajemy pary +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) ; <------------------- !!! +(struct car-expr (e) #:transparent) ; <------------------- !!! +(struct cdr-expr (e) #:transparent) ; <------------------- !!! +(struct is-pair (e) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] ; <----------- !!! + [(car-expr e) (expr? e)] ; <---------------------------------- !!! + [(cdr-expr e) (expr? e)] ; <---------------------------------- !!! + [(is-pair e) (expr? e)] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) ; <- !!! + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'car)) ; <-- !!! + (car-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'cdr)) ; <-- !!! + (cdr-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'pair?)) + (is-pair (parse (second q)))])) + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) ; <---------------- !!! + (eval-env e2 env))] + [(car-expr e) (car (eval-env e env))] ; <--------------------- !!! + [(cdr-expr e) (cdr (eval-env e env))] ; <------------------- !!! + [(is-pair e) (cons? (eval-env e env))])) +(define (eval e) (eval-env e env-empty)) + +(define program + '(car (if true (cons 1 2) false))) + +(define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/lista8/zad5.bak b/Semestr 2/racket/lista6/lista8/zad5.bak new file mode 100644 index 0000000..6f1f7b4 --- /dev/null +++ b/Semestr 2/racket/lista6/lista8/zad5.bak @@ -0,0 +1 @@ +#lang racket diff --git a/Semestr 2/racket/lista6/lista8/zad5.rkt b/Semestr 2/racket/lista6/lista8/zad5.rkt new file mode 100644 index 0000000..721f5bf --- /dev/null +++ b/Semestr 2/racket/lista6/lista8/zad5.rkt @@ -0,0 +1,151 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct unop (op e) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! + + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!! + (parse-lam (second q) (third q))] + [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (symbol? (first q))) + (unop (first q) (parse (second q)))])) + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + ['not not] ['car car] ['cdr cdr] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(unop op e) ((op->proc op) (eval-env e env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(let [twice (lambda (f x) (f (f x)))] + (let [inc (lambda (x) (+ 1 x))] + (twice twice twice twice inc 1)))) + + +(define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/lista8/zad6.bak b/Semestr 2/racket/lista6/lista8/zad6.bak new file mode 100644 index 0000000..721f5bf --- /dev/null +++ b/Semestr 2/racket/lista6/lista8/zad6.bak @@ -0,0 +1,151 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct unop (op e) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! + + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!! + (parse-lam (second q) (third q))] + [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (symbol? (first q))) + (unop (first q) (parse (second q)))])) + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + ['not not] ['car car] ['cdr cdr] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(unop op e) ((op->proc op) (eval-env e env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(let [twice (lambda (f x) (f (f x)))] + (let [inc (lambda (x) (+ 1 x))] + (twice twice twice twice inc 1)))) + + +(define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/lista8/zad6.rkt b/Semestr 2/racket/lista6/lista8/zad6.rkt new file mode 100644 index 0000000..c7ea9f0 --- /dev/null +++ b/Semestr 2/racket/lista6/lista8/zad6.rkt @@ -0,0 +1,171 @@ +#lang racket + +; Do list.rkt dodajemy procedury +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct unop (op e) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) +(struct cons-expr (e1 e2) #:transparent) +(struct null-expr () #:transparent) +(struct null?-expr (e) #:transparent) +(struct app (f e) #:transparent) ; <------------------ !!! +(struct lam (id e) #:transparent) ; <------------------ !!! + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] + [(unop op e) (and (symbol? op) (expr? e))] + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) + (and (expr? eb) (expr? et) (expr? ef))] + [(cons-expr e1 e2) (and (expr? e1) (expr? e2))] + [(null-expr) true] + [(null?-expr e) (expr? e)] + [(app f e) (and (expr? f) (expr? e))] ; <--------------------- !!! + [(lam id e) (and (symbol? id) (expr? e))] ; <----------------- !!! + [_ false])) + +(define (cedar? f) + (let ((letters (string->list (symbol->string f)))) + (and (> (length letters) 2) + (eq? (first letters) #\c) + (eq? (first (reverse letters)) #\r) + (andmap (lambda (x) (or (eq? x #\a) (eq? x #\d))) + (cdr letters))))) + +(define (get-cedar letters xs) + (cond [(eq? (car letters) #\r) xs] + [(eq? (car letters) #\a) (unop 'car (get-cedar (cdr letters) xs))] + [(eq? (car letters) #\d) (unop 'cdr (get-cedar (cdr letters) xs))])) + +(define (cedar f xs) + (let ((letters (string->list (symbol->string f)))) + (get-cedar (cdr (reverse letters)) xs))) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] + [(eq? q 'false) (const false)] + [(eq? q 'null) (null-expr)] + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 2) (eq? (first q) 'null?)) + (null?-expr (parse (second q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'cons)) + (cons-expr (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'lambda)) ; <!!! + (parse-lam (second q) (third q))] + [(and (list? q) (eq? (length q) 2) (symbol? (first q)) + (cedar? (first q))) + (cedar (first q) (parse (second q)))] + [(and (list? q) (pair? q) (not (op->proc (car q)))) ; <------- !!! + (parse-app q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))] + [(and (list? q) (eq? (length q) 2) (symbol? (first q))) + (unop (first q) (parse (second q)))])) + +(define (parse-app q) ; <----------------------------------------- !!! + (define (parse-app-accum q acc) + (cond [(= 1 (length q)) (app acc (parse (car q)))] + [else (parse-app-accum (cdr q) (app acc (parse (car q))))])) + (parse-app-accum (cdr q) (parse (car q)))) + +(define (parse-lam pat e) ; <------------------------------------- !!! + (cond [(= 1 (length pat)) + (lam (car pat) (parse e))] + [else + (lam (car pat) (parse-lam (cdr pat) e))])) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs) #:transparent) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(struct clo (id e env) #:transparent) ; <------------------------- !!! + +(define (value? v) + (or (number? v) + (boolean? v) + (and (pair? v) (value? (car v)) (value? (cdr v))) + (null? v) + (clo? v))) ; <---------------------------------------------- !!! + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))] + ['not not] ['car car] ['cdr cdr] + [_ false])) ; <--------------------------------------- !!! + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(unop op e) ((op->proc op) (eval-env e env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) + (eval-env et env) + (eval-env ef env))] + [(cons-expr e1 e2) (cons (eval-env e1 env) + (eval-env e2 env))] + [(null-expr) null] + [(null?-expr e) (null? (eval-env e env))] + [(lam x e) (clo x e env)] ; <--------------------------------- !!! + [(app f e) ; <------------------------------------------------ !!! + (let ([vf (eval-env f env)] + [ve (eval-env e env)]) + (match vf [(clo x body fun-env) + (eval-env body (env-add x ve fun-env))]))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(let [twice (lambda (f x) (f (f x)))] + (let [inc (lambda (x) (+ 1 x))] + (twice twice twice twice inc 1)))) + + +(define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/lista8/zadanie.rkt b/Semestr 2/racket/lista6/lista8/zadanie.rkt new file mode 100644 index 0000000..0960f21 --- /dev/null +++ b/Semestr 2/racket/lista6/lista8/zadanie.rkt @@ -0,0 +1,98 @@ +#lang racket + +; Do let-env.rkt dodajemy wartosci boolowskie +; +; Miejsca, ktore sie zmienily oznaczone sa przez !!! + +; --------- ; +; Wyrazenia ; +; --------- ; + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) +(struct var-expr (id) #:transparent) +(struct let-expr (id e1 e2) #:transparent) +(struct if-expr (eb et ef) #:transparent) + +(define (expr? e) + (match e + [(const n) (or (number? n) (boolean? n))] ; <----------------- !!! + [(binop op l r) (and (symbol? op) (expr? l) (expr? r))] + [(var-expr x) (symbol? x)] + [(let-expr x e1 e2) + (and (symbol? x) (expr? e1) (expr? e2))] + [(if-expr eb et ef) ; <--------------------------------------- !!! + (and (expr? eb) (expr? et) (expr? ef))] + [_ false])) + +(define (parse q) + (cond + [(number? q) (const q)] + [(eq? q 'true) (const true)] ; <---------------------------- !!! + [(eq? q 'false) (const false)] ; <---------------------------- !!! + [(symbol? q) (var-expr q)] + [(and (list? q) (eq? (length q) 3) (eq? (first q) 'let)) + (let-expr (first (second q)) + (parse (second (second q))) + (parse (third q)))] + [(and (list? q) (eq? (length q) 4) (eq? (first q) 'if)) ; <--- !!! + (if-expr (parse (second q)) + (parse (third q)) + (parse (fourth q)))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) + (parse (second q)) + (parse (third q)))])) + +(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1)))) + +; ---------- ; +; Srodowiska ; +; ---------- ; + +(struct environ (xs)) + +(define env-empty (environ null)) +(define (env-add x v env) + (environ (cons (cons x v) (environ-xs env)))) +(define (env-lookup x env) + (define (assoc-lookup xs) + (cond [(null? xs) (error "Unknown identifier" x)] + [(eq? x (car (car xs))) (cdr (car xs))] + [else (assoc-lookup (cdr xs))])) + (assoc-lookup (environ-xs env))) + +; --------- ; +; Ewaluacja ; +; --------- ; + +(define (value? v) + (or (number? v) (boolean? v))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /] ['% modulo] ; <----------- !!! + ['= =] ['> >] ['>= >=] ['< <] ['<= <=] + ['and (lambda (x y) (and x y))] + ['or (lambda (x y) (or x y))])) + +(define (eval-env e env) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval-env l env) + (eval-env r env))] + [(let-expr x e1 e2) + (eval-env e2 (env-add x (eval-env e1 env) env))] + [(var-expr x) (env-lookup x env)] + [(if-expr eb et ef) (if (eval-env eb env) ; <----------------- !!! + (eval-env et env) + (eval-env ef env))])) + +(define (eval e) (eval-env e env-empty)) + +(define program + '(if (or (< (% 123 10) 5) + true) + (+ 2 3) + (/ 2 0))) + +(define (test-eval) (eval (parse program)))
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/solution.bak b/Semestr 2/racket/lista6/solution.bak new file mode 100644 index 0000000..0805991 --- /dev/null +++ b/Semestr 2/racket/lista6/solution.bak @@ -0,0 +1,27 @@ +#lang racket + +(provide (struct-out complex) parse eval) + +(struct complex (re im) #:transparent) + +(define value? + complex?) + +;; Ponizej znajduje sie interpreter zwyklych wyrazen arytmetycznych. +;; Zadanie to zmodyfikowac go tak, by dzialal z liczbami zespolonymi. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /])) + +(define (eval e) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval l) (eval r))])) + +(define (parse q) + (cond [(number? q) (const q)] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) (parse (second q)) (parse (third q)))]))
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/solution.rkt b/Semestr 2/racket/lista6/solution.rkt new file mode 100644 index 0000000..59bdecd --- /dev/null +++ b/Semestr 2/racket/lista6/solution.rkt @@ -0,0 +1,73 @@ +#lang racket + +(provide (struct-out complex) parse eval) + +(struct complex (re im) #:transparent) + +(define value? + complex?) + +(define (comp-plus x y) + (let ((x-re (complex-re x)) + (x-im (complex-im x)) + (y-re (complex-re y)) + (y-im (complex-im y))) + (complex (+ x-re y-re) (+ x-im y-im)))) + +(define (comp-minus x y) + (let ((x-re (complex-re x)) + (x-im (complex-im x)) + (y-re (complex-re y)) + (y-im (complex-im y))) + (complex (- x-re y-re) (- x-im y-im)))) + +(define (comp-mult x y) + (let ((x-re (complex-re x)) + (x-im (complex-im x)) + (y-re (complex-re y)) + (y-im (complex-im y))) + (complex (- (* x-re y-re) (* x-im y-im)) (+ (* x-re y-im) (* x-im y-re))))) + +(define (comp-mod2 x) + (let ((x-re (complex-re x)) + (x-im (complex-im x))) + (complex (+ (* x-re x-re) (* x-im x-im)) 0))) + +(define (comp-mod x) + (let ((mod2 (comp-mod2 x)) + (x-re (complex-re x))) + (complex (sqrt x-re) 0))) + +(define (comp-div x y) + (let* ((mod2 (complex-re (comp-mod2 y))) + (x-re (complex-re x)) + (x-im (complex-im x)) + (y-re (complex-re y)) + (y-im (complex-im y)) + (real (+ (* x-re y-re) (* x-im y-im))) + (imag (- (* x-im y-re) (* x-re y-im)))) + (complex (/ real mod2) (/ imag mod2)))) + + +;; Ponizej znajduje sie interpreter zwyklych wyrazen arytmetycznych. +;; Zadanie to zmodyfikowac go tak, by dzialal z liczbami zespolonymi. + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (imaginary-unit? c) + (eq? c 'i)) + +(define (op->proc op) + (match op ['+ comp-plus] ['- comp-minus] ['* comp-mult] ['/ comp-div])) + +(define (eval e) + (match e + [(const n) n] + [(binop op l r) ((op->proc op) (eval l) (eval r))])) + +(define (parse q) + (cond [(number? q) (const (complex q 0))] + [(imaginary-unit? q) (const (complex 0 1))] + [(and (list? q) (eq? (length q) 3) (symbol? (first q))) + (binop (first q) (parse (second q)) (parse (third q)))]))
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/zad11/solution.bak b/Semestr 2/racket/lista6/zad11/solution.bak new file mode 100644 index 0000000..f449481 --- /dev/null +++ b/Semestr 2/racket/lista6/zad11/solution.bak @@ -0,0 +1,36 @@ +#lang racket + +(provide (struct-out const) (struct-out binop) rpn->arith) + +;; ------------------------------- +;; Wyrazenia w odwr. not. polskiej +;; ------------------------------- + +(define (rpn-expr? e) + (and (list? e) + (pair? e) + (andmap (lambda (x) (or (number? x) (member x '(+ - * /)))) + e))) + +;; ---------------------- +;; Wyrazenia arytmetyczne +;; ---------------------- + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (arith-expr? e) + (match e + [(const n) (number? n)] + [(binop op l r) + (and (symbol? op) (arith-expr? l) (arith-expr? r))] + [_ false])) + +;; ---------- +;; Kompilacja +;; ---------- + +(define (rpn->arith e) + (error "TODO: Uzupelnij tutaj")) + +; Mozesz tez dodac jakies procedury pomocnicze i testy
\ No newline at end of file diff --git a/Semestr 2/racket/lista6/zad11/solution.rkt b/Semestr 2/racket/lista6/zad11/solution.rkt new file mode 100644 index 0000000..a44afe4 --- /dev/null +++ b/Semestr 2/racket/lista6/zad11/solution.rkt @@ -0,0 +1,58 @@ +#lang racket + +(provide (struct-out const) (struct-out binop) rpn->arith) + +;; ------------------------------- +;; Wyrazenia w odwr. not. polskiej +;; ------------------------------- + +(define (rpn-expr? e) + (and (list? e) + (pair? e) + (andmap (lambda (x) (or (number? x) (member x '(+ - * /)))) + e))) + +;; ---------------------- +;; Wyrazenia arytmetyczne +;; ---------------------- + +(struct const (val) #:transparent) +(struct binop (op l r) #:transparent) + +(define (arith-expr? e) + (match e + [(const n) (number? n)] + [(binop op l r) + (and (symbol? op) (arith-expr? l) (arith-expr? r))] + [_ false])) + +;; ---------- +;; Kompilacja +;; ---------- + +(struct stack (xs)) + +(define empty-stack (stack null)) +(define (empty-stack? s) (null? (stack-xs s))) +(define (top s) (car (stack-xs s))) +(define (push a s) (stack (cons a (stack-xs s)))) +(define (pop s) (stack (cdr (stack-xs s)))) + +(define (op->proc op) + (match op ['+ +] ['- -] ['* *] ['/ /])) + +(define (eval-am e s) + (cond [(null? e) + (top s)] + [(number? (car e)) + (eval-am (cdr e) (push (const (car e)) s))] + [(symbol? (car e)) + (eval-am (cdr e) + (push (binop (car e) (top (pop s)) (top s)) + (pop (pop s))))])) + +(define (rpn->arith e) + (eval-am e empty-stack)) + + +; Mozesz tez dodac jakies procedury pomocnicze i testy
\ No newline at end of file diff --git a/Semestr 2/racket/luk.rkt b/Semestr 2/racket/luk.rkt new file mode 100644 index 0000000..cc319a5 --- /dev/null +++ b/Semestr 2/racket/luk.rkt @@ -0,0 +1,137 @@ +#lang typed/racket
+
+; Do let-env.rkt dodajemy wartosci boolowskie
+;
+; Miejsca, ktore sie zmienily oznaczone sa przez !!!
+
+; --------- ;
+; Wyrazenia ;
+; --------- ;
+(provide parse typecheck)
+
+(define-type Value (U Boolean Real))
+(define-type Expr (U const binop var-expr let-expr if-expr))
+(define-type ArithSymbol (U '+ '- '* '/))
+(define-type LogicSymbol (U 'and 'or))
+(define-type CompSymbol (U '< '= '> '<= '>=))
+(define-type BinomSymbol (U ArithSymbol LogicSymbol CompSymbol))
+
+(define-type Binop-list (List BinomSymbol Any Any))
+(define-type Let-list (List 'let (List Symbol Any) Any))
+(define-type If-list (List 'if Any Any Any))
+
+(define-predicate Binop-list? Binop-list)
+(define-predicate Let-list? Let-list)
+(define-predicate If-list? If-list)
+
+(struct const ([val : Value]) #:transparent)
+(struct binop ([op : BinomSymbol] [l : Expr] [r : Expr]) #:transparent)
+(struct var-expr ([id : Symbol]) #:transparent)
+(struct let-expr ([id : Symbol] [e1 : Expr] [e2 : Expr]) #:transparent)
+(struct if-expr ([eb : Expr] [et : Expr] [ef : Expr]) #:transparent)
+
+(define-predicate Value? Value)
+(define-predicate Expr? Expr)
+(define-predicate BinomSymbol? BinomSymbol)
+(define-predicate ArithSymbol? ArithSymbol)
+(define-predicate LogicSymbol? LogicSymbol)
+(define-predicate CompSymbol? CompSymbol)
+(define-predicate BinomValue? BinomValue)
+
+
+
+(: parse (-> Any Expr))
+(define (parse q)
+ (cond
+ [(real? q) (const q)]
+ [(eq? q 'true) (const true)] ; <---------------------------- !!!
+ [(eq? q 'false) (const false)] ; <---------------------------- !!!
+ [(symbol? q) (var-expr q)]
+ [(Let-list? q)
+ (let-expr (first (second q))
+ (parse (second (second q)))
+ (parse (third q)))]
+ [(If-list? q) ; <--- !!!
+ (if-expr (parse (second q))
+ (parse (third q))
+ (parse (fourth q)))]
+ [(Binop-list? q)
+ (binop (first q)
+ (parse (second q))
+ (parse (third q)))]
+ [else (error "Blad parsowania" q)]))
+
+
+
+
+(define (test-parse) (parse '(let [x (+ 2 2)] (+ x 1))))
+
+; ---------- ;
+; Srodowiska ;
+; ---------- ;
+(define-type EType ( U 'real 'boolean ) )
+(define-type Env (Listof (Pairof Symbol EType)))
+(define-predicate Env? Env)
+(struct environ ([xs : Env]))
+
+(: env-empty environ)
+(define env-empty (environ null))
+(: env-add (-> Symbol EType environ environ))
+(define (env-add x v env)
+ (environ (cons (cons x v) (environ-xs env))))
+(: env-lookup (-> Symbol environ (U EType #f)))
+(define (env-lookup x env)
+ (: assoc-lookup (-> Env EType))
+ (define (assoc-lookup xs)
+ (cond [(null? xs) (error "Unknown identifier" x)]
+ [(eq? x (car (car xs))) (cdr (car xs))]
+ [else (assoc-lookup (cdr xs))]))
+ (assoc-lookup (environ-xs env)))
+
+
+(: typecheck (-> Expr (U EType #f)))
+(define (typecheck q)
+ (: give (-> Expr environ (U EType #f)))
+ (define (give q envi)
+ (cond
+ [(const? q) (if (boolean? (const-val q)) 'boolean 'real)]
+ [(var-expr? q) (env-lookup (var-expr-id q) envi)]
+ [(let-expr? q)
+ (let ([p (give (let-expr-e1 q) envi)]) (if (false? p) #f (give (let-expr-e2 q) (env-add (let-expr-id q) p envi))))]
+ [(binop? q)
+ (cond
+ ([ArithSymbol? (binop-op q)] (if (and (eq? 'real (give (binop-l q) envi)) (eq? 'real (give (binop-r q) envi))) 'real #f))
+ ([LogicSymbol? (binop-op q)] (if (and (eq? 'boolean (give (binop-l q) envi)) (eq? 'boolean (give (binop-r q) envi))) 'boolean #f))
+ ([CompSymbol? (binop-op q)] (if (and (eq? 'real (give (binop-l q) envi)) (eq? 'real (give (binop-r q) envi))) 'boolean #f))
+ [else #f])]
+ [(if-expr? q)
+ (if (and (eq? 'real (if-expr-eb q))
+ (eq? (give (if-expr-et q) envi) (give (if-expr-ef q) envi)))
+ (give (if-expr-et q) envi)
+ #f)]
+ [else #f]))
+
+
+ (give q env-empty))
+
+
+
+(define program2
+ '(if true
+ (let [x 5] (+ 5 false))
+ (/ 2 2)))
+
+(define program3
+ '(let [x (+ 2 3)]
+ (let [y (< 2 3)]
+ (+ x y))))
+
+(define program4
+ '(let [x (and true true)] x))
+
+(define wtf
+ '(and true true))
+
+(typecheck (parse program2))
+(typecheck (parse program3))
+(typecheck (parse program4))
diff --git a/Semestr 2/racket/rac.rkt b/Semestr 2/racket/rac.rkt new file mode 100644 index 0000000..8300208 --- /dev/null +++ b/Semestr 2/racket/rac.rkt @@ -0,0 +1,371 @@ +#reader(lib"read.ss""wxme")WXME0109 ## +#| + This file uses the GRacket editor format. + Open this file in DrRacket version 7.6 or later to read it. + + Most likely, it was created by saving a program in DrRacket, + and it probably contains a program with non-text elements + (such as images or comment boxes). + + http://racket-lang.org/ +|# + 33 7 #"wxtext\0" +3 1 6 #"wxtab\0" +1 1 8 #"wximage\0" +2 0 8 #"wxmedia\0" +4 1 34 #"(lib \"syntax-browser.ss\" \"mrlib\")\0" +1 0 36 #"(lib \"cache-image-snip.ss\" \"mrlib\")\0" +1 0 68 +(0 + #"((lib \"image-core.ss\" \"mrlib\") (lib \"image-core-wxme.rkt\" \"mr" + #"lib\"))\0" +) 1 0 16 #"drscheme:number\0" +3 0 44 #"(lib \"number-snip.ss\" \"drscheme\" \"private\")\0" +1 0 36 #"(lib \"comment-snip.ss\" \"framework\")\0" +1 0 93 +(1 + #"((lib \"collapsed-snipclass.ss\" \"framework\") (lib \"collapsed-sni" + #"pclass-wxme.ss\" \"framework\"))\0" +) 0 0 43 #"(lib \"collapsed-snipclass.ss\" \"framework\")\0" +0 0 19 #"drscheme:sexp-snip\0" +0 0 29 #"drscheme:bindings-snipclass%\0" +1 0 101 +(2 + #"((lib \"ellipsis-snip.rkt\" \"drracket\" \"private\") (lib \"ellipsi" + #"s-snip-wxme.rkt\" \"drracket\" \"private\"))\0" +) 2 0 88 +(3 + #"((lib \"pict-snip.rkt\" \"drracket\" \"private\") (lib \"pict-snip.r" + #"kt\" \"drracket\" \"private\"))\0" +) 0 0 55 +#"((lib \"snip.rkt\" \"pict\") (lib \"snip-wxme.rkt\" \"pict\"))\0" +1 0 34 #"(lib \"bullet-snip.rkt\" \"browser\")\0" +0 0 25 #"(lib \"matrix.ss\" \"htdp\")\0" +1 0 22 #"drscheme:lambda-snip%\0" +1 0 29 #"drclickable-string-snipclass\0" +0 0 26 #"drracket:spacer-snipclass\0" +0 0 57 +#"(lib \"hrule-snip.rkt\" \"macro-debugger\" \"syntax-browser\")\0" +1 0 26 #"drscheme:pict-value-snip%\0" +0 0 45 #"(lib \"image-snipr.ss\" \"slideshow\" \"private\")\0" +1 0 38 #"(lib \"pict-snipclass.ss\" \"slideshow\")\0" +2 0 55 #"(lib \"vertical-separator-snip.ss\" \"stepper\" \"private\")\0" +1 0 18 #"drscheme:xml-snip\0" +1 0 31 #"(lib \"xml-snipclass.ss\" \"xml\")\0" +1 0 21 #"drscheme:scheme-snip\0" +2 0 34 #"(lib \"scheme-snipclass.ss\" \"xml\")\0" +1 0 10 #"text-box%\0" +1 0 32 #"(lib \"text-snipclass.ss\" \"xml\")\0" +1 0 1 6 #"wxloc\0" + 0 0 64 0 1 #"\0" +0 75 1 #"\0" +0 10 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 0 9 +#"Standard\0" +0 75 12 #"Courier New\0" +0 26 90 -1 90 -1 3 -1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 255 255 255 1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 -1 -1 2 24 +#"framework:default-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 15 +#"text:ports out\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 150 0 150 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1 +-1 2 15 #"text:ports err\0" +0 -1 1 #"\0" +1 0 -1 -1 93 -1 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 17 +#"text:ports value\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 175 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 +-1 2 27 #"Matching Parenthesis Style\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 34 139 34 0 0 0 -1 +-1 2 1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 37 +#"framework:syntax-color:scheme:symbol\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 38 +#"framework:syntax-color:scheme:keyword\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 38 38 128 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 +38 #"framework:syntax-color:scheme:comment\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 194 116 31 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 37 +#"framework:syntax-color:scheme:string\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 35 +#"framework:syntax-color:scheme:text\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 39 +#"framework:syntax-color:scheme:constant\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 41 128 38 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 49 +#"framework:syntax-color:scheme:hash-colon-keyword\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 42 +#"framework:syntax-color:scheme:parenthesis\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 132 60 36 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36 +#"framework:syntax-color:scheme:error\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 36 +#"framework:syntax-color:scheme:other\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 16 +#"Misspelled Text\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 +38 #"drracket:check-syntax:lexically-bound\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 81 112 203 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 28 +#"drracket:check-syntax:set!d\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 37 +#"drracket:check-syntax:unused-require\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 36 +#"drracket:check-syntax:free-variable\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 255 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 31 +#"drracket:check-syntax:imported\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 68 0 203 0 0 0 -1 -1 2 47 +#"drracket:check-syntax:my-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 178 34 34 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 50 +#"drracket:check-syntax:their-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 116 0 0 0 0 -1 -1 2 48 +#"drracket:check-syntax:unk-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 +49 #"drracket:check-syntax:both-obligation-style-pref\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 139 142 28 0 0 0 -1 -1 2 +26 #"plt:htdp:test-coverage-on\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 1 +#"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 2 27 +#"plt:htdp:test-coverage-off\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 4 1 +#"\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 4 4 #"XML\0" +0 70 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 2 37 #"plt:module-language:test-coverage-on\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 -1 -1 2 38 +#"plt:module-language:test-coverage-off\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 93 -1 -1 0 1 0 0 0 1 0 0 0 0 0 0 255 165 0 0 0 0 -1 -1 0 36 +#"mrlib/syntax-browser:subtitle-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 36 36 140 255 255 255 -1 +-1 0 42 #"mrlib/syntax-browser:focused-syntax-color\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 34 139 34 255 255 255 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 4 1 #"\0" +0 -1 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 100 0 0 0 0 -1 +-1 4 1 #"\0" +0 71 1 #"\0" +1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 255 0 0 0 0 0 -1 +-1 2 1 #"\0" +0 70 1 #"\0" +1.0 0 -1 -1 93 -1 -1 -1 0 0 0 0 0 0 0 0 0 1.0 1.0 1.0 148 0 211 0 0 0 -1 +-1 2 1 #"\0" +0 -1 1 #"\0" +1.0 0 -1 -1 -1 -1 -1 -1 1 0 0 0 0 0 0 0 0 1.0 1.0 1.0 0 0 255 0 0 0 -1 +-1 0 1 #"\0" +0 -1 1 #"\0" +0 12 -1 -1 -1 -1 -1 -1 0 0 1 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 2 1 #"\0" +0 -1 1 #"\0" +0 12 -1 -1 -1 -1 -1 -1 0 0 1 0 0 0 1.0 1.0 1.0 1.0 1.0 1.0 0 0 0 0 0 0 +-1 -1 2 1 #"\0" +0 -1 1 #"\0" +1 0 -1 -1 -1 -1 -1 -1 0 0 0 0 0 0 0 0 0 1 1 1 200 0 0 0 0 0 -1 -1 4 1 +#"\0" +0 -1 1 #"\0" +1.0 0 92 -1 -1 -1 -1 -1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 255 255 0 -1 -1 + 0 122 0 28 3 12 #"#lang racket" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 6 #"define" +0 0 24 3 2 #" (" +0 0 14 3 6 #"fringe" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 15 3 4 #"cond" +0 0 24 3 3 #" ((" +0 0 14 3 5 #"null?" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 2 #") " +0 0 14 3 4 #"null" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 10 #" ((" +0 0 14 3 3 #"not" +0 0 24 3 2 #" (" +0 0 14 3 5 #"pair?" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 4 #")) (" +0 0 14 3 4 #"list" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 14 3 4 #"else" +0 0 24 3 2 #" (" +0 0 14 3 6 #"append" +0 0 24 3 2 #" (" +0 0 14 3 6 #"fringe" +0 0 24 3 2 #" (" +0 0 14 3 3 #"car" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 2 #"))" +0 0 24 29 1 #"\n" +0 0 24 3 23 #" (" +0 0 14 3 6 #"fringe" +0 0 24 3 2 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 4 #"tree" +0 0 24 3 6 #"))))))" +0 0 24 29 1 #"\n" +0 0 24 29 1 #"\n" +0 0 24 3 1 #"(" +0 0 15 3 6 #"define" +0 0 24 3 2 #" (" +0 0 14 3 7 #"subsets" +0 0 24 3 1 #" " +0 0 14 3 1 #"s" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 3 #" (" +0 0 14 3 2 #"if" +0 0 24 3 2 #" (" +0 0 14 3 5 #"null?" +0 0 24 3 1 #" " +0 0 14 3 1 #"s" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 7 #" (" +0 0 14 3 4 #"list" +0 0 24 3 1 #" " +0 0 14 3 4 #"null" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 7 #" (" +0 0 15 3 3 #"let" +0 0 24 3 3 #" ((" +0 0 14 3 4 #"rest" +0 0 24 3 2 #" (" +0 0 14 3 7 #"subsets" +0 0 24 3 2 #" (" +0 0 14 3 3 #"cdr" +0 0 24 3 1 #" " +0 0 14 3 1 #"s" +0 0 24 3 4 #"))))" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 14 3 7 #"display" +0 0 24 3 1 #" " +0 0 14 3 1 #"s" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 14 3 7 #"newline" +0 0 24 3 1 #")" +0 0 24 29 1 #"\n" +0 0 24 3 9 #" (" +0 0 14 3 6 #"append" +0 0 24 3 1 #" " +0 0 14 3 4 #"rest" +0 0 24 3 2 #" (" +0 0 14 3 3 #"map" +0 0 24 3 2 #" (" +0 0 15 3 6 #"lambda" +0 0 24 3 2 #" (" +0 0 14 3 1 #"x" +0 0 24 3 3 #") (" +0 0 14 3 4 #"cons" +0 0 24 3 2 #" (" +0 0 14 3 3 #"car" +0 0 24 3 1 #" " +0 0 14 3 1 #"s" +0 0 24 3 2 #") " +0 0 14 3 1 #"x" +0 0 24 3 3 #")) " +0 0 14 3 4 #"rest" +0 0 24 3 5 #")))))" +0 0 24 29 1 #"\n" +0 0 24 3 2 #" " +0 0 diff --git a/Semestr 2/racket/solution.rkt b/Semestr 2/racket/solution.rkt new file mode 100644 index 0000000..3643668 --- /dev/null +++ b/Semestr 2/racket/solution.rkt @@ -0,0 +1,14 @@ +#lang racket + +(provide heapsort) (require "leftist.rkt") + +(define (heapsort xs) + (define (create-heap xs res) + (if (null? xs) + res + (create-heap (cdr xs) (heap-insert (cons (car xs) (car xs)) res)))) + (define (heap-to-list h) + (if (heap-empty? h) + null + (cons (elem-val (heap-min h)) (heap-to-list (heap-pop h))))) + (heap-to-list (create-heap xs empty-heap)))
\ No newline at end of file diff --git a/Semestr 2/topo/106185944_268984110829847_6553948354204680381_n.jpg b/Semestr 2/topo/106185944_268984110829847_6553948354204680381_n.jpg Binary files differnew file mode 100644 index 0000000..3e15629 --- /dev/null +++ b/Semestr 2/topo/106185944_268984110829847_6553948354204680381_n.jpg diff --git a/Semestr 2/topo/106656932_2682289525419459_8890828706710255563_n.jpg b/Semestr 2/topo/106656932_2682289525419459_8890828706710255563_n.jpg Binary files differnew file mode 100644 index 0000000..cf85459 --- /dev/null +++ b/Semestr 2/topo/106656932_2682289525419459_8890828706710255563_n.jpg diff --git a/Semestr 2/topo/106703086_728253774716175_2262465163427979269_n.jpg b/Semestr 2/topo/106703086_728253774716175_2262465163427979269_n.jpg Binary files differnew file mode 100644 index 0000000..d650007 --- /dev/null +++ b/Semestr 2/topo/106703086_728253774716175_2262465163427979269_n.jpg diff --git a/Semestr 2/topo/106792000_316914386368237_6535047497894014786_n.jpg b/Semestr 2/topo/106792000_316914386368237_6535047497894014786_n.jpg Binary files differnew file mode 100644 index 0000000..824dacf --- /dev/null +++ b/Semestr 2/topo/106792000_316914386368237_6535047497894014786_n.jpg diff --git a/Semestr 2/topo/107093323_1187351634957579_7077220020141497805_n.jpg b/Semestr 2/topo/107093323_1187351634957579_7077220020141497805_n.jpg Binary files differnew file mode 100644 index 0000000..8ce9801 --- /dev/null +++ b/Semestr 2/topo/107093323_1187351634957579_7077220020141497805_n.jpg diff --git a/Semestr 2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf b/Semestr 2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf new file mode 100644 index 0000000..468dd99 --- /dev/null +++ b/Semestr 2/topo/ACFrOgA9nUCrq9uSc6NvJxX3WRdWzjzunaans9KaKhMQKJdrLr6UW8LvP9BJrKFCP9iw4sZnygGqHO3idi_74KDTN2R91USZQTZz8tzhNReeRj8mm31ZqZfiYsDVgiI=.pdf @@ -0,0 +1,3629 @@ +%PDF-1.7 +% +1 0 obj +<< +/AcroForm 2 0 R +/Lang (pl-PL) +/MarkInfo << +/Marked true +>> +/Metadata 3 0 R +/Pages 4 0 R +/StructTreeRoot 5 0 R +/Type /Catalog +/ViewerPreferences 6 0 R +/OpenAction 7 0 R +>> +endobj +8 0 obj +<< +/Author (Kkudalla) +/CreationDate (D:20200706133743+02'00') +/Creator <4D6963726F736F6674AE20576F726420646C61204D6963726F736F667420333635> +/ModDate (D:20200706133807+02'00') +/Producer <4D6963726F736F6674AE20576F726420646C61204D6963726F736F667420333635> +>> +endobj +2 0 obj +<< +/DA (/Helv 0 Tf 0 g ) +/DR << +/Encoding << +/PDFDocEncoding 9 0 R +>> +/Font << +/Helv 10 0 R +/MyriadPro-Regular 11 0 R +/ZaDb 12 0 R +>> +>> +/Fields [13 0 R] +/SigFlags 3 +>> +endobj +3 0 obj +<< +/Length 3324 +/Subtype /XML +/Type /Metadata +>> +stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c017 91.164374, 2020/03/05-20:41:30 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:pdf="http://ns.adobe.com/pdf/1.3/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"> + <pdf:Producer>Microsoft® Word dla Microsoft 365</pdf:Producer> + <dc:format>application/pdf</dc:format> + <dc:creator> + <rdf:Seq> + <rdf:li>Kkudalla</rdf:li> + </rdf:Seq> + </dc:creator> + <xmp:CreatorTool>Microsoft® Word dla Microsoft 365</xmp:CreatorTool> + <xmp:CreateDate>2020-07-06T13:37:43+02:00</xmp:CreateDate> + <xmp:ModifyDate>2020-07-06T13:38:07+02:00</xmp:ModifyDate> + <xmp:MetadataDate>2020-07-06T13:38:07+02:00</xmp:MetadataDate> + <xmpMM:DocumentID>uuid:AF6C3520-A81E-46E5-BE7E-22ACA2CA4797</xmpMM:DocumentID> + <xmpMM:InstanceID>uuid:39ce6e44-37dc-4684-94d5-a1c3cb352be5</xmpMM:InstanceID> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?>
+endstream +endobj +4 0 obj +<< +/Count 2 +/Kids [14 0 R 15 0 R] +/Type /Pages +>> +endobj +5 0 obj +<< +/IDTree 16 0 R +/K [17 0 R] +/ParentTree 18 0 R +/ParentTreeNextKey 2 +/RoleMap 19 0 R +/Type /StructTreeRoot +>> +endobj +6 0 obj +<< +/DisplayDocTitle true +>> +endobj +7 0 obj +<< +/Type /Action +/S /JavaScript +/JS (this.print\({bUI:true,bSilent:false,bShrinkToFit:true}\);) +>> +endobj +9 0 obj +<< +/Differences [24 /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek /ring /tilde 39 +/quotesingle 96 /grave 128 /bullet /dagger /daggerdbl /ellipsis /emdash /endash +/florin /fraction /guilsinglleft /guilsinglright /minus /perthousand /quotedblbase /quotedblleft /quotedblright /quoteleft +/quoteright /quotesinglbase /trademark /fi /fl /Lslash /OE /Scaron /Ydieresis /Zcaron +/dotlessi /lslash /oe /scaron /zcaron 160 /Euro 164 /currency 166 +/brokenbar 168 /dieresis /copyright /ordfeminine 172 /logicalnot /.notdef /registered /macron +/degree /plusminus /twosuperior /threesuperior /acute /mu 183 /periodcentered /cedilla /onesuperior +/ordmasculine 188 /onequarter /onehalf /threequarters 192 /Agrave /Aacute /Acircumflex /Atilde +/Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute +/Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply +/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute +/acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis +/igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde +/odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] +/Type /Encoding +>> +endobj +10 0 obj +<< +/BaseFont /Helvetica +/Encoding 9 0 R +/Name /Helv +/Subtype /Type1 +/Type /Font +>> +endobj +11 0 obj +<< +/BaseFont /MyriadPro-Regular +/Encoding /WinAnsiEncoding +/FirstChar 0 +/FontDescriptor 20 0 R +/LastChar 255 +/Subtype /Type1 +/Type /Font +/Widths [500 500 500 500 500 500 500 500 500 500 +500 500 500 500 500 500 500 500 500 500 +500 500 500 500 500 500 500 500 500 500 +500 500 212 230 337 497 513 792 605 188 +284 284 415 596 207 307 207 343 513 513 +513 513 513 513 513 513 513 513 207 207 +596 596 596 406 737 612 542 580 666 492 +487 646 652 239 370 542 472 804 658 689 +532 689 538 493 497 647 558 846 571 541 +553 284 341 284 596 500 300 482 569 448 +564 501 292 559 555 234 243 469 236 834 +555 549 569 563 327 396 331 551 481 736 +463 471 428 284 239 284 596 282 513 282 +207 513 356 1000 500 500 300 1156 493 255 +894 282 553 282 282 207 207 354 354 282 +500 1000 300 619 396 255 863 282 428 541 +212 230 513 513 513 513 239 519 300 677 +346 419 596 307 419 300 318 596 311 305 +300 553 512 207 300 244 355 419 759 759 +759 406 612 612 612 612 612 612 788 580 +492 492 492 492 239 239 239 239 671 658 +689 689 689 689 689 596 689 647 647 647 +647 541 531 548 482 482 482 482 482 482 +773 448 501 501 501 501 234 234 234 234 +541 555 549 549 549 549 549 596 549 551 +551 551 551 471 569 471] +>> +endobj +12 0 obj +<< +/BaseFont /ZapfDingbats +/Name /ZaDb +/Subtype /Type1 +/Type /Font +>> +endobj +13 0 obj +<< +/AP << +/N 21 0 R +>> +/DA (/MyriadPro-Regular 0 Tf 0 Tz 0 g) +/F 132 +/FT /Sig +/MK << +>> +/P 15 0 R +/Rect [415.34 499.989 518.347 549.339] +/Subtype /Widget +/T (Signature2) +/Type /Annot +/V 22 0 R +>> +endobj +14 0 obj +<< +/Contents [23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R] +/CropBox [0 0 595.2 841.8] +/Group << +/CS /DeviceRGB +/S /Transparency +/Type /Group +>> +/MediaBox [0 0 595.2 841.8] +/Parent 4 0 R +/Resources << +/ExtGState << +/GS10 31 0 R +/GS11 32 0 R +>> +/Font << +/F1 33 0 R +/F2 34 0 R +/F3 35 0 R +/F4 36 0 R +/F5 37 0 R +/F6 38 0 R +/F7 39 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Rotate 0 +/StructParents 0 +/Tabs /S +/Type /Page +>> +endobj +15 0 obj +<< +/Annots [13 0 R] +/Contents 40 0 R +/CropBox [0 0 595.2 841.8] +/Group << +/CS /DeviceRGB +/S /Transparency +/Type /Group +>> +/MediaBox [0 0 595.2 841.8] +/Parent 4 0 R +/Resources << +/ExtGState << +/GS10 31 0 R +/GS11 32 0 R +>> +/Font << +/F1 33 0 R +/F2 34 0 R +/F3 35 0 R +/F4 36 0 R +/F5 37 0 R +/F7 39 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Rotate 0 +/StructParents 1 +/Tabs /S +/Type /Page +>> +endobj +16 0 obj +<< +/Names [(Note 1) 41 0 R] +>> +endobj +17 0 obj +<< +/K [42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R +52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 61 0 R +62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 41 0 R 68 0 R 69 0 R 70 0 R +71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R +81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R +91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R] +/P 5 0 R +/S /Document +/Type /StructElem +>> +endobj +18 0 obj +<< +/Nums [0 [100 0 R 101 0 R 102 0 R 103 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R +51 0 R 52 0 R 53 0 R 104 0 R 105 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R +60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 106 0 R 107 0 R 108 0 R +109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R +119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 68 0 R 69 0 R 70 0 R +71 0 R 126 0 R 127 0 R 73 0 R 74 0 R 75 0 R 128 0 R 76 0 R 129 0 R 77 0 R +130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R] + 1 [136 0 R 137 0 R 78 0 R 79 0 R 80 0 R 138 0 R 139 0 R 140 0 R 82 0 R 83 0 R +84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 141 0 R 142 0 R 90 0 R 91 0 R 92 0 R +93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R] +] +>> +endobj +19 0 obj +<< +/Annotation /Sect +/Artifact /Sect +/Chart /Sect +/Chartsheet /Part +/Diagram /Figure +/Dialogsheet /Part +/Endnote /Note +/Footer /Sect +/Footnote /Note +/Header /Sect +/InlineShape /Sect +/Macrosheet /Part +/Slide /Part +/Textbox /Sect +/Workbook /Document +/Worksheet /Part +>> +endobj +20 0 obj +<< +/Ascent 952 +/CapHeight 674 +/CharSet (/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/grave/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis) +/Descent -250 +/Flags 32 +/FontBBox [-157 -250 1126 952] +/FontFamily (Myriad Pro) +/FontFile3 143 0 R +/FontName /MyriadPro-Regular +/FontStretch /Normal +/FontWeight 400 +/ItalicAngle 0 +/StemV 88 +/Type /FontDescriptor +/XHeight 484 +>> +endobj +21 0 obj +<< +/Length 7 +/BBox [0.0 0.0 103.007 49.3506] +/Resources << +/XObject << +/FRM 144 0 R +>> +>> +/Subtype /Form +/Type /XObject +>> +stream
+/FRM Do
+endstream +endobj +22 0 obj +<< +/ByteRange [0 148276 206888 135679] +/Contents <30826F0406092A864886F70D010702A0826EF530826EF1020101310F300D06096086480165030402010500300B06092A864886F70D010701A0820DAD308206943082047CA00302010202141A5734B0D472D251E1D37CFE3D796AC117102490300D06092A864886F70D01010D0500306F310B300906035504061302504C311D301B060355040A0C144E61726F646F77792042616E6B20506F6C736B693126302406035504030C1D4E61726F646F77652043656E7472756D20436572747966696B61636A693119301706035504610C10564154504C2D35323530303038313938301E170D3137303231343132323631395A170D3238303231343233353935395A306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F4365727430820222300D06092A864886F70D01010105000382020F003082020A0282020100D0F7EAC0E3C610864FF50A76823A98316BAB7F62BAE9ACC87C6BCACBD45CDE6539990F480FC14CBC2578762236229D8C7A0A96BB19DE7DD6B24C4AF83F7CD22A8DDD67C61FA595D711B92C33089C6274AF15CBF99AAFF628C3035CF3381BF9D343B7AB54861E812D6D0BD606AAB494FF3213B35D0E3DDF25B8282D301B0B19748548DDC4CA00B597D89E606FB6AA46386CC4F6574D77F26B5A93C4024905415D30D89AF4FD45C3E577C0E3A09BC89CE95FB350AD44BBF156053F2269BA4958230AA8C7E3A3F83C1A1F5691941371F28AD0539B621A2AD239E8BB744275CDA956D6519D726091782F58A91081DE53CC8ABAEC72B0DA8F4ADAE0D1047883EE0D831016C709319A76A8D4E6FE6F088E5D9E5C42413D79F7C9392F2C6D19EEFC054D6685CE8089D2E1C5CCD2EBD47F0966CB6701CF05E012C84EAD6D00FA7F797956E2A55BBF8019EF1CFE1C0401979ED852ACB789B26453DE8BA56416A2E2836231457C0A002302979BA7F73D322C5B71B5444315D0323D0F50AD0AEC5F47F6F88B14FCFA6A6EB5841D42130B5B6112B380F45B8DD7B0C9FF6EBA0DE17CC4F17F560A39D120A6DB06A731E88E45013C14210A841300C096D3A647050341A252933360AEC26EB6DE2E419791B74B4EA1FF1A0280B30EB904BB427E92ACCC6C36F19960C87557A0AC2DE74EBD682816EB38A1FDA4C6EB7B9D0C66E28028C58D9A761B0203010001A382012630820122300F0603551D130101FF040530030101FF3081AC0603551D230481A43081A1801429B3C8C4DFA387F866051258FD462AB8980D7987A173A471306F310B300906035504061302504C311D301B060355040A0C144E61726F646F77792042616E6B20506F6C736B693126302406035504030C1D4E61726F646F77652043656E7472756D20436572747966696B61636A693119301706035504610C10564154504C2D35323530303038313938821440F8F78AB0E364105691C8D9E02CF8C1C6400A4630310603551D200101FF0427302530230604551D2000301B301906082B06010505070201160D7777772E6E63636572742E706C300E0603551D0F0101FF040403020106301D0603551D0E0416041474627099FF1B603BC464B5841FA3150C5CCB5FBD300D06092A864886F70D01010D050003820201007FA1A8393E66C6D57B7A372DB71A7CB0335A77A5C394660F6C3D33931E42A25FA7ACD09F5751276C6840A5FD787468A795B68A8C44F2D195FAA3BFFE48AEB100495DB87AEC76F87B0AE5F8992B217C31C8E3C4EAF9CCEF41AFF0F5B214CEBD22F2ED9FB94C77E947F58D22F9063D3B2A8B8E55B478AA4DAEED3571C70AC31836A3EBECB2F5B5C6590817F1FB629FAF0699FE4CC1312FB01D50EE8D1A8F352582AB69AAA14FDE77C824D51BC722A092BFDB94737A001E3F4521F7268611ABEE5F6F423B8788AAD3496660809564452C174583AFAE84297E460EB56FDE4A47534D946255A3DA43862BEE8EC265013C0260ED039D76A7EF0EB35411EB997A47BB5C7BB1763B458CAD98B5CC3457150576231263EE3D6EACC2DF24C888DF9CC135088BE1B25E51CB031F739A5542815658BABC4DD3EE120A8DC77837E43ED3CA03382916363D5939FBDADD13AB04B20EFB1A956604CBD53EE66461442CA65D55B52A05D50E9BE575F9BB6E96EB9B21A33254E6A87ED5248670BFC11DD7ABEE4F38555C9FE3D8896A49D201768F031ED506589A5DE3B4205B58BDB96A5E68AE3CAE57A3181AC697B9C4F0FE654BBE8D5C9B453BE021F38A3E524C2321EE7D1B908791472F8E7E12803D1BC08CBCE5843FA69CABE0B2137CFDC6FB00E1FBED8B6274CA377D851F41EF3655DB229F778C004DB027A5F805DF844C7B0CB09F21FAC5E1D130820711308204F9A003020102020B51434130335F0200040400300D06092A864886F70D01010B0500306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F43657274301E170D3139303831393039323932375A170D3231303831383039323932375A30733122302006035504030C1941445249414E41204557454C494E41204D454459C583534B41311A301806035504050C11504E4F504C2D38303037313130383036353112301006035504040C094D454459C583534B413110300E060355042A0C0741445249414E41310B300906035504060C02504C308201A2300D06092A864886F70D01010105000382018F003082018A028201810097B18BD986A1CC9EF8163917F6ECC60D9D3EAC7266A4562EC61011591BE7118EB1BA94D3A86100BF05D410876698C1AD52F382358A28EF00F26F3E6AF26F86F78EF4EE24B96F4395DC408E6E18FAADA9F09EC5F3C47B007709FBB22783818C084C34B6E05F2C3EFBF3E5131F43F6FFEDC31750D911F753D7A9AD3AD4C6B3C0C1C379B7F5B93908D7EE5691C1E0D0C0E334943C65B47AFEA66EE5CB81A86461BBA4BB92363266A35B1D6B903F7BD342EB1B5463E90D6FEDED6E9B6F7382945FB0B88F8D8AB7AD4852CD4406CD2FD9FC9CBE99449BEBE608EC05A363BB0FF9147B066157E045C7A965852F379F2F7A36674F1894D57ACA5417074E0DAAA27D008477C0778C38CA88DAD6A6DEE9FE110F5CC5004D40274DB3CE8F084324E8E371518349339E19DE449A97AEE4517ADF5A4BD44F0595D1660575A1619EBFC77E9FA3261CCFEE30B0E508E1470719F93C148DE5A0821074AE7468E40B1E04B7320F4D2A60787B5D7BA679666E44AB7580111579FB17DE2E6948CB88C5C38C0695E4EB0203010001A382022830820224301F0603551D2304183016801474627099FF1B603BC464B5841FA3150C5CCB5FBD301D0603551D0E041604149B410D4D610FB58C12AF87E64658A00A50F02DBB300F0603551D130101FF04053003010100300E0603551D0F0101FF0404030206403081D70603551D200101FF0481CC3081C93081B1060A2A84680186F87F0102023081A2303006082B060105050702011624687474703A2F2F7777772E6575726F636572742E706C2F7265706F7A79746F7269756D2F306E06082B0601050507020230620C60436572747966696B617420777973746177696F6E79207A676F646E6965207A207A61736164616D69206F706973616E796D69207720646F6B756D656E63696520506F6C6974796B6120436572747966696B61636A6920776572736A6120322E303009060704008BEC4001023008060604008F7A010230310603551D1F042A30283026A024A0228620687474703A2F2F63726C2E6575726F636572742E706C2F71636130332E63726C307B06082B06010505070101046F306D302806082B06010505073001861C687474703A2F2F63726C2E6575726F636572742E706C2F4F4353502F304106082B06010505073002863568747470733A2F2F6575726F636572742E706C2F7075622F507261776F2F51434130335F4575726F636572745F323031372E646572303706082B06010505070103042B30293008060604008E4601013008060604008E4601043013060604008E4601063009060704008E46010601300D06092A864886F70D01010B05000382020100A383702A04DD1450F0B2B864D20CC314D405F80400F730A8D5B2E655AF12E656EFE76CAD4FA528E7CDE08C8688FFC33149132B18C10801EAF095C221EDB494CEF54643EAA0474FEBDCE4F4AE8ECCA634D162E0C0584C58357CF643FA00CF6A8318A3CCE94AFB26B79DB3D8FDA6AF6A5954376CB888789A2C681E430510B09F526A05C437B742D2986490E867BBB630260CB38ACFEDB1914E4148B29F40BA937171B2526D8E3BCE3E8F0F2475E22D45B45A3213E69A23DB126B0CE635D63D86145807B17C14F37500B147B3FFE26A5C6BBCEB8976083285F3D0C1982E3A162CD7E8702D172DADD4204BC94D131F8C2CDDF152361F15CE73E33177996BEE537AB9ED4B6B46F8C3509BC309468BC1012CA68D7C8BDA8870C5855440FF01318B5F955BA513B1454C80F4651C2A329836FEF680106EF47DF0CC70EE8A101B061BC50A9CDDD5C936FC5CC119137E89B17BD9A7DB936E74B9E8CDBBB728953B7831A2DD954EF92148C3BCA8C22006D1CBA79D383F9A5C915B6C721D46134C307BE59026F779D90DD2F69DC8D4F6E1E072855FF2368D611627F3925C3706D491D58C35E1809866D1A8C6D89D887D381D8828BEBBE16A39310387EDC94D6B6AD2150DE7134036FB7A4BA34761ABE66A2EC42D86F53ACA59A277ACA40C5C292E6919DCB55B6B04D87D60BE1436EC62F57FBE3DC941F2FB5ACE402D5203AE60F97B004EB7933182611B30826117020101307E306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F43657274020B51434130335F0200040400300D06096086480165030402010500A0825EEE301806092A864886F70D010903310B06092A864886F70D010701302F06092A864886F70D010904312204202185C186075BD6983C93408D3816E6C8D99987A15F2BEB7666EA73EC13645AFB30825E9F06092A864886F72F01010831825E9030825E8CA0825E8830825E8430825E8030825C68020101300D06092A864886F70D01010B0500306F3119301706035504610C10564154504C2D39353132333532333739310B300906035504061302504C311C301A060355040A0C134575726F436572742053702E207A206F2E6F2E3127302506035504030C1E43656E7472756D204B77616C6966696B6F77616E65204575726F43657274170D3230303730363035303030315A170D3230303730373035303030315A30825B91302402023634170D3138303230313130313333395A300F300D0603551D1501010004030A0105302402023633170D3138303230313130313335325A300F300D0603551D1501010004030A0105302402023639170D3138303230323132303031375A300F300D0603551D1501010004030A010130250203313132170D3138303532323134303633335A300F300D0603551D1501010004030A010530250203313936170D3138303730333130323735375A300F300D0603551D1501010004030A010130250203333239170D3138303730393134323634375A300F300D0603551D1501010004030A01053026020431313332170D3138303732353037343532345A300F300D0603551D1501010004030A01053026020431313238170D3138303732353037343634315A300F300D0603551D1501010004030A010530250203353436170D3138303930333038343531395A300F300D0603551D1501010004030A01033026020431383237170D3138303930353134333731355A300F300D0603551D1501010004030A01003026020431383236170D3138303930363037313634355A300F300D0603551D1501010004030A01043026020431383235170D3138303930363037313734355A300F300D0603551D1501010004030A01043026020431343437170D3138303931323131343733345A300F300D0603551D1501010004030A010430250203343739170D3138303931333035343032305A300F300D0603551D1501010004030A01053026020432343935170D3138303931393035313935385A300F300D0603551D1501010004030A01043026020433373330170D3138313032393132333432375A300F300D0603551D1501010004030A01043026020432373439170D3138313130353038313334305A300F300D0603551D1501010004030A01053026020433383134170D3138313130383132323533335A300F300D0603551D1501010004030A01043026020431303633170D3138313130383132323534305A300F300D0603551D1501010004030A01043026020436353436170D3139303131313132333931355A300F300D0603551D1501010004030A01043026020434363939170D3139303131353138313632325A300F300D0603551D1501010004030A01013026020433333232170D3139303131363133343735325A300F300D0603551D1501010004030A0105302402023833170D3139303133303133343033355A300F300D0603551D1501010004030A010530250203353139170D3139303230373130353331355A300F300D0603551D1501010004030A01013026020433343632170D3139303230383130343235315A300F300D0603551D1501010004030A01013026020437383832170D3139303232323038343332395A300F300D0603551D1501010004030A01013026020439363937170D3139303232373133343833315A300F300D0603551D1501010004030A01013026020435373232170D3139303331353039313030355A300F300D0603551D1501010004030A01043026020435373234170D3139303331353039313034305A300F300D0603551D1501010004030A0104302702053130313839170D3139303331353039313132355A300F300D0603551D1501010004030A0104302702053130363835170D3139303331353039313235305A300F300D0603551D1501010004030A01053026020439303233170D3139303331353039313435335A300F300D0603551D1501010004030A010530250203333832170D3139303332373039333133395A300F300D0603551D1501010004030A0101302D020B51434130335F0104070205170D3139303431353038303431395A300F300D0603551D1501010004030A01043026020435393133170D3139303431353038303534345A300F300D0603551D1501010004030A0104302D020B51434130335F0101050908170D3139303431363131333035345A300F300D0603551D1501010004030A0105302D020B51434130335F0105000409170D3139303432393039333635335A300F300D0603551D1501010004030A0101302D020B51434130335F0104060106170D3139303530373037303833335A300F300D0603551D1501010004030A0101302D020B51434130335F0104050800170D3139303530383131353634375A300F300D0603551D1501010004030A0104302D020B51434130335F0105050803170D3139303530383131353734315A300F300D0603551D1501010004030A0101302D020B51434130335F0105040801170D3139303530383131353830345A300F300D0603551D1501010004030A0101302D020B51434130335F0104070907170D3139303530383131353832325A300F300D0603551D1501010004030A0101302D020B51434130335F0104060806170D3139303530383131353930385A300F300D0603551D1501010004030A0101302D020B51434130335F0104020407170D3139303530383131353935345A300F300D0603551D1501010004030A0101302D020B51434130335F0104020103170D3139303530383132303032355A300F300D0603551D1501010004030A0105302D020B51434130335F0104020606170D3139303530383132303034375A300F300D0603551D1501010004030A01013026020431373734170D3139303530383132303131335A300F300D0603551D1501010004030A01013026020431373736170D3139303530383132303133315A300F300D0603551D1501010004030A01013026020433383434170D3139303530383133303235325A300F300D0603551D1501010004030A01013026020435333432170D3139303530393038343934395A300F300D0603551D1501010004030A01013026020432343631170D3139303531333131333432355A300F300D0603551D1501010004030A0101302702053130373836170D3139303532393039323435325A300F300D0603551D1501010004030A01043026020436323332170D3139303630373038323032305A300F300D0603551D1501010004030A01013026020431343332170D3139303631383039303333315A300F300D0603551D1501010004030A0101302D020B51434130335F0108010704170D3139303731353038323834305A300F300D0603551D1501010004030A0105302D020B51434130335F0108010505170D3139303731353038323834395A300F300D0603551D1501010004030A0105302D020B51434130335F0108060605170D3139303830313132343132335A300F300D0603551D1501010004030A0104302D020B51434130335F0106010108170D3139303830313132343432365A300F300D0603551D1501010004030A0101302D020B51434130335F0109070406170D3139303830313132343533375A300F300D0603551D1501010004030A0104302D020B51434130335F0109070302170D3139303830313132343630315A300F300D0603551D1501010004030A0104302D020B51434130335F0102010609170D3139303830313132343633345A300F300D0603551D1501010004030A0105302702053130343036170D3139303830313132343835375A300F300D0603551D1501010004030A0104302D020B51434130335F0105080608170D3139303830323131313635315A300F300D0603551D1501010004030A0104302D020B51434130335F0101060503170D3139303830353132313632385A300F300D0603551D1501010004030A0105302D020B51434130335F0108010707170D3139303830363037313835325A300F300D0603551D1501010004030A0101302D020B51434130335F0107090503170D3139303832393130333335375A300F300D0603551D1501010004030A0101302D020B51434130335F0103020407170D3139303833303133313435365A300F300D0603551D1501010004030A0104302D020B51434130335F0101090500170D3139303932343037323532375A300F300D0603551D1501010004030A0101302D020B51434130335F0201070703170D3139303932373039303835345A300F300D0603551D1501010004030A0101302D020B51434130335F0103040508170D3139313030383039323735325A300F300D0603551D1501010004030A01053026020439343537170D3139313032333039303430345A300F300D0603551D1501010004030A0105302D020B51434130335F0202040602170D3139313032333039303735305A300F300D0603551D1501010004030A0105302D020B51434130335F0106000304170D3139313032333039313033355A300F300D0603551D1501010004030A0101302D020B51434130335F0202000105170D3139313032333039313430395A300F300D0603551D1501010004030A0104302D020B51434130335F0107020008170D3139313130383037353532385A300F300D0603551D1501010004030A0105302D020B51434130335F0202070308170D3139313130383037353535385A300F300D0603551D1501010004030A0101302D020B51434130335F0108040708170D3139313130383037353632355A300F300D0603551D1501010004030A01033026020431383437170D3139313131353131313835375A300F300D0603551D1501010004030A01043026020431323233170D3139313131353131313930355A300F300D0603551D1501010004030A01043026020433353234170D3139313131353131323330315A300F300D0603551D1501010004030A01053026020433353531170D3139313131353131323331305A300F300D0603551D1501010004030A0105302D020B51434130335F0105060807170D3139313132303131303531375A300F300D0603551D1501010004030A0101302D020B51434130335F0103000405170D3139313132353134343532345A300F300D0603551D1501010004030A01013026020437353436170D3139313132383039303834305A300F300D0603551D1501010004030A0105302D020B51434130335F0107020606170D3139313231323133303635345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040609170D3139313231333039333933335A300F300D0603551D1501010004030A0105302D020B51434130335F0200030900170D3139313231373134333234315A300F300D0603551D1501010004030A0105302D020B51434130335F0201020704170D3139313231373134333332365A300F300D0603551D1501010004030A0105302D020B51434130335F0201060100170D3139313231383131323634355A300F300D0603551D1501010004030A0105302D020B51434130335F0201070309170D3139313233303130303732375A300F300D0603551D1501010004030A0101302D020B51434130335F0201070306170D3139313233303130303831395A300F300D0603551D1501010004030A01013026020433333233170D3139313233303130303931385A300F300D0603551D1501010004030A0105302D020B51434130335F0103070606170D3139313233303130303935375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030509170D3139313233303130313132355A300F300D0603551D1501010004030A0104302D020B51434130335F0203090705170D3230303130333131303234315A300F300D0603551D1501010004030A0105302D020B51434130335F0204010605170D3230303130333131303330315A300F300D0603551D1501010004030A0103302D020B51434130335F0200090606170D3230303131303130313132315A300F300D0603551D1501010004030A0104302D020B51434130335F0105080501170D3230303131343132303733305A300F300D0603551D1501010004030A0101302702053131343630170D3230303131343132323832395A300F300D0603551D1501010004030A01013026020437383430170D3230303131373039333633385A300F300D0603551D1501010004030A0101302D020B51434130335F0108040302170D3230303132303037313333375A300F300D0603551D1501010004030A01013026020436303130170D3230303132303133353433345A300F300D0603551D1501010004030A0101302D020B51434130335F0203020404170D3230303132303231343730395A300F300D0603551D1501010004030A0101302D020B51434130335F0203020500170D3230303132303231343731305A300F300D0603551D1501010004030A0101302D020B51434130335F0203020501170D3230303132303231343731305A300F300D0603551D1501010004030A0101302D020B51434130335F0203020508170D3230303132303231343731305A300F300D0603551D1501010004030A0101302D020B51434130335F0203020605170D3230303132303231343731315A300F300D0603551D1501010004030A0101302D020B51434130335F0203020800170D3230303132303231343731315A300F300D0603551D1501010004030A0101302D020B51434130335F0203020805170D3230303132303231343731315A300F300D0603551D1501010004030A0101302D020B51434130335F0203020807170D3230303132303231343731325A300F300D0603551D1501010004030A0101302D020B51434130335F0203020809170D3230303132303231343731325A300F300D0603551D1501010004030A0101302D020B51434130335F0203020900170D3230303132303231343731325A300F300D0603551D1501010004030A0101302D020B51434130335F0203020901170D3230303132303231343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0203020902170D3230303132303231343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0203030002170D3230303132303231343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0203030005170D3230303132303231343731345A300F300D0603551D1501010004030A0101302D020B51434130335F0203030103170D3230303132303231343731345A300F300D0603551D1501010004030A0101302D020B51434130335F0203030107170D3230303132303231343731345A300F300D0603551D1501010004030A0101302D020B51434130335F0203030200170D3230303132303231343731355A300F300D0603551D1501010004030A0101302D020B51434130335F0203030205170D3230303132303231343731355A300F300D0603551D1501010004030A0101302D020B51434130335F0203030206170D3230303132303231343731355A300F300D0603551D1501010004030A0101302D020B51434130335F0203030302170D3230303132303231343731365A300F300D0603551D1501010004030A0101302D020B51434130335F0203030504170D3230303132303231343731365A300F300D0603551D1501010004030A0101302D020B51434130335F0203030608170D3230303132303231343731375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030609170D3230303132303231343731375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030700170D3230303132303231343731375A300F300D0603551D1501010004030A0101302D020B51434130335F0203030802170D3230303132303231343731385A300F300D0603551D1501010004030A0101302D020B51434130335F0203030808170D3230303132303231343731385A300F300D0603551D1501010004030A0101302D020B51434130335F0203030909170D3230303132303231343731385A300F300D0603551D1501010004030A0101302D020B51434130335F0203040002170D3230303132303231343731395A300F300D0603551D1501010004030A0101302D020B51434130335F0203040004170D3230303132303231343731395A300F300D0603551D1501010004030A0101302D020B51434130335F0203040101170D3230303132303231343731395A300F300D0603551D1501010004030A0101302D020B51434130335F0203040200170D3230303132303231343732305A300F300D0603551D1501010004030A0101302D020B51434130335F0203040206170D3230303132303231343732305A300F300D0603551D1501010004030A0101302D020B51434130335F0203040208170D3230303132303231343732305A300F300D0603551D1501010004030A0101302D020B51434130335F0203040306170D3230303132303231343732315A300F300D0603551D1501010004030A0101302D020B51434130335F0203040309170D3230303132303231343732315A300F300D0603551D1501010004030A0101302D020B51434130335F0203040400170D3230303132303231343732315A300F300D0603551D1501010004030A0101302D020B51434130335F0203040401170D3230303132303231343732325A300F300D0603551D1501010004030A0101302D020B51434130335F0203040403170D3230303132303231343732325A300F300D0603551D1501010004030A0101302D020B51434130335F0203040404170D3230303132303231343732325A300F300D0603551D1501010004030A0101302D020B51434130335F0203040405170D3230303132303231343732335A300F300D0603551D1501010004030A0101302D020B51434130335F0203040407170D3230303132303231343732335A300F300D0603551D1501010004030A0101302D020B51434130335F0203040409170D3230303132303231343732345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040509170D3230303132303231343732345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040602170D3230303132303231343732345A300F300D0603551D1501010004030A0101302D020B51434130335F0203040607170D3230303132303231343732355A300F300D0603551D1501010004030A0101302D020B51434130335F0203040608170D3230303132303231343732355A300F300D0603551D1501010004030A0101302D020B51434130335F0203040700170D3230303132303231343732355A300F300D0603551D1501010004030A0101302D020B51434130335F0203040702170D3230303132303231343732365A300F300D0603551D1501010004030A0101302D020B51434130335F0203040708170D3230303132303231343732365A300F300D0603551D1501010004030A0101302D020B51434130335F0203040709170D3230303132303231343732365A300F300D0603551D1501010004030A0101302D020B51434130335F0203040803170D3230303132303231343732375A300F300D0603551D1501010004030A0101302D020B51434130335F0203040900170D3230303132303231343732375A300F300D0603551D1501010004030A0101302D020B51434130335F0203040902170D3230303132303231343732375A300F300D0603551D1501010004030A0101302D020B51434130335F0203040905170D3230303132303231343732385A300F300D0603551D1501010004030A0101302D020B51434130335F0203050004170D3230303132303231343732385A300F300D0603551D1501010004030A0101302D020B51434130335F0203050108170D3230303132303231343732385A300F300D0603551D1501010004030A0101302D020B51434130335F0203050203170D3230303132303231343732395A300F300D0603551D1501010004030A0101302D020B51434130335F0203050207170D3230303132303231343732395A300F300D0603551D1501010004030A0101302D020B51434130335F0203050300170D3230303132303231343733305A300F300D0603551D1501010004030A0101302D020B51434130335F0203050401170D3230303132303231343733305A300F300D0603551D1501010004030A0101302D020B51434130335F0203050404170D3230303132303231343733305A300F300D0603551D1501010004030A0101302D020B51434130335F0203050405170D3230303132303231343733315A300F300D0603551D1501010004030A0101302D020B51434130335F0203050503170D3230303132303231343733315A300F300D0603551D1501010004030A0101302D020B51434130335F0203050509170D3230303132303231343733315A300F300D0603551D1501010004030A0101302D020B51434130335F0203050600170D3230303132303231343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0203050605170D3230303132303231343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0203050607170D3230303132303231343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0203050706170D3230303132303231343733335A300F300D0603551D1501010004030A0101302D020B51434130335F0203050707170D3230303132303231343733335A300F300D0603551D1501010004030A0101302D020B51434130335F0203050708170D3230303132303231343733335A300F300D0603551D1501010004030A0101302D020B51434130335F0203050800170D3230303132303231343733345A300F300D0603551D1501010004030A0101302D020B51434130335F0203050801170D3230303132303231343733345A300F300D0603551D1501010004030A0101302D020B51434130335F0203050807170D3230303132303231343733345A300F300D0603551D1501010004030A0101302D020B51434130335F0203050808170D3230303132303231343733355A300F300D0603551D1501010004030A0101302D020B51434130335F0203050900170D3230303132303231343733355A300F300D0603551D1501010004030A0101302D020B51434130335F0203050901170D3230303132303231343733355A300F300D0603551D1501010004030A0101302D020B51434130335F0203050905170D3230303132303231343733365A300F300D0603551D1501010004030A0101302D020B51434130335F0203050907170D3230303132303231343733365A300F300D0603551D1501010004030A0101302D020B51434130335F0203050908170D3230303132303231343733375A300F300D0603551D1501010004030A0101302D020B51434130335F0203050909170D3230303132303231343733375A300F300D0603551D1501010004030A0101302D020B51434130335F0203060000170D3230303132303231343733375A300F300D0603551D1501010004030A0101302D020B51434130335F0203060003170D3230303132303231343733385A300F300D0603551D1501010004030A0101302D020B51434130335F0203060007170D3230303132303231343733385A300F300D0603551D1501010004030A0101302D020B51434130335F0203060009170D3230303132303231343733385A300F300D0603551D1501010004030A0101302D020B51434130335F0203060102170D3230303132303231343733395A300F300D0603551D1501010004030A0101302D020B51434130335F0203060103170D3230303132303231343733395A300F300D0603551D1501010004030A0101302D020B51434130335F0203060200170D3230303132303231343733395A300F300D0603551D1501010004030A0101302D020B51434130335F0203060301170D3230303132303231343734305A300F300D0603551D1501010004030A0101302D020B51434130335F0203060306170D3230303132303231343734305A300F300D0603551D1501010004030A0101302D020B51434130335F0203060401170D3230303132303231343734305A300F300D0603551D1501010004030A0101302D020B51434130335F0203060403170D3230303132303231343734315A300F300D0603551D1501010004030A0101302D020B51434130335F0203060405170D3230303132303231343734315A300F300D0603551D1501010004030A0101302D020B51434130335F0203060406170D3230303132303231343734325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060601170D3230303132303231343734325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060604170D3230303132303231343734325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060605170D3230303132303231343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0203060608170D3230303132303231343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0203060609170D3230303132303231343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0203060700170D3230303132303231343734345A300F300D0603551D1501010004030A0101302D020B51434130335F0203060705170D3230303132303231343734345A300F300D0603551D1501010004030A0101302D020B51434130335F0203060806170D3230303132303231343734345A300F300D0603551D1501010004030A0101302D020B51434130335F0203060807170D3230303132303231343734355A300F300D0603551D1501010004030A0101302D020B51434130335F0203060808170D3230303132303231343734355A300F300D0603551D1501010004030A0101302D020B51434130335F0203060900170D3230303132303231343734355A300F300D0603551D1501010004030A0101302D020B51434130335F0203060908170D3230303132303231343734365A300F300D0603551D1501010004030A0101302D020B51434130335F0203070003170D3230303132303231343734365A300F300D0603551D1501010004030A0101302D020B51434130335F0203070005170D3230303132303231343734375A300F300D0603551D1501010004030A0101302D020B51434130335F0203070007170D3230303132303231343734375A300F300D0603551D1501010004030A0101302D020B51434130335F0203070009170D3230303132303231343734375A300F300D0603551D1501010004030A0101302D020B51434130335F0203070102170D3230303132303231343734385A300F300D0603551D1501010004030A0101302D020B51434130335F0203070107170D3230303132303231343734385A300F300D0603551D1501010004030A0101302D020B51434130335F0203070200170D3230303132303231343734385A300F300D0603551D1501010004030A0101302D020B51434130335F0203070201170D3230303132303231343734395A300F300D0603551D1501010004030A0101302D020B51434130335F0203070206170D3230303132303231343734395A300F300D0603551D1501010004030A0101302D020B51434130335F0203070306170D3230303132303231343734395A300F300D0603551D1501010004030A0101302D020B51434130335F0203070308170D3230303132303231343735305A300F300D0603551D1501010004030A0101302D020B51434130335F0203070400170D3230303132303231343735305A300F300D0603551D1501010004030A0101302D020B51434130335F0203070403170D3230303132303231343735315A300F300D0603551D1501010004030A0101302D020B51434130335F0203070508170D3230303132303231343735315A300F300D0603551D1501010004030A0101302D020B51434130335F0203070601170D3230303132303231343735315A300F300D0603551D1501010004030A0101302D020B51434130335F0203070605170D3230303132303231343735325A300F300D0603551D1501010004030A0101302D020B51434130335F0203070701170D3230303132303231343735325A300F300D0603551D1501010004030A0101302D020B51434130335F0203070705170D3230303132303231343735325A300F300D0603551D1501010004030A0101302D020B51434130335F0203070706170D3230303132303231343735335A300F300D0603551D1501010004030A0101302D020B51434130335F0203070709170D3230303132303231343735335A300F300D0603551D1501010004030A0101302D020B51434130335F0203070800170D3230303132303231343735335A300F300D0603551D1501010004030A0101302D020B51434130335F0203070802170D3230303132303231343735345A300F300D0603551D1501010004030A0101302D020B51434130335F0203070803170D3230303132303231343735345A300F300D0603551D1501010004030A0101302D020B51434130335F0203070806170D3230303132303231343735355A300F300D0603551D1501010004030A0101302D020B51434130335F0203070808170D3230303132303231343735355A300F300D0603551D1501010004030A0101302D020B51434130335F0203070901170D3230303132303231343735355A300F300D0603551D1501010004030A0101302D020B51434130335F0203070904170D3230303132303231343735365A300F300D0603551D1501010004030A0101302D020B51434130335F0203080000170D3230303132303231343735365A300F300D0603551D1501010004030A0101302D020B51434130335F0203080002170D3230303132303231343735365A300F300D0603551D1501010004030A0101302D020B51434130335F0203080009170D3230303132303231343735375A300F300D0603551D1501010004030A0101302D020B51434130335F0203080100170D3230303132303231343735375A300F300D0603551D1501010004030A0101302D020B51434130335F0203080103170D3230303132303231343735375A300F300D0603551D1501010004030A0101302D020B51434130335F0203080104170D3230303132303231343735385A300F300D0603551D1501010004030A0101302D020B51434130335F0203080108170D3230303132303231343735385A300F300D0603551D1501010004030A0101302D020B51434130335F0203080200170D3230303132303231343735395A300F300D0603551D1501010004030A0101302D020B51434130335F0203080203170D3230303132303231343735395A300F300D0603551D1501010004030A0101302D020B51434130335F0203080205170D3230303132303231343735395A300F300D0603551D1501010004030A0101302D020B51434130335F0203080206170D3230303132303231343830305A300F300D0603551D1501010004030A0101302D020B51434130335F0203080207170D3230303132303231343830305A300F300D0603551D1501010004030A0101302D020B51434130335F0203080208170D3230303132303231343830305A300F300D0603551D1501010004030A0101302D020B51434130335F0203080304170D3230303132303231343830315A300F300D0603551D1501010004030A0101302D020B51434130335F0203080308170D3230303132303231343830315A300F300D0603551D1501010004030A0101302D020B51434130335F0203080400170D3230303132303231343830315A300F300D0603551D1501010004030A0101302D020B51434130335F0203080402170D3230303132303231343830325A300F300D0603551D1501010004030A0101302D020B51434130335F0203080505170D3230303132303231343830325A300F300D0603551D1501010004030A0101302D020B51434130335F0203080507170D3230303132303231343830335A300F300D0603551D1501010004030A0101302D020B51434130335F0203080602170D3230303132303231343830335A300F300D0603551D1501010004030A0101302D020B51434130335F0203080604170D3230303132303231343830335A300F300D0603551D1501010004030A0101302D020B51434130335F0203080608170D3230303132303231343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0203080701170D3230303132303231343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0203080704170D3230303132303231343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0203080706170D3230303132303231343830355A300F300D0603551D1501010004030A0101302D020B51434130335F0203080902170D3230303132303231343830355A300F300D0603551D1501010004030A0101302D020B51434130335F0203080904170D3230303132303231343830355A300F300D0603551D1501010004030A0101302D020B51434130335F0203080906170D3230303132303231343830365A300F300D0603551D1501010004030A0101302D020B51434130335F0203090005170D3230303132303231343830365A300F300D0603551D1501010004030A0101302D020B51434130335F0203090101170D3230303132303231343830375A300F300D0603551D1501010004030A0101302D020B51434130335F0203090106170D3230303132303231343830375A300F300D0603551D1501010004030A0101302D020B51434130335F0203090107170D3230303132303231343830375A300F300D0603551D1501010004030A0101302D020B51434130335F0203090204170D3230303132303231343830385A300F300D0603551D1501010004030A0101302D020B51434130335F0203090206170D3230303132303231343830385A300F300D0603551D1501010004030A0101302D020B51434130335F0203090207170D3230303132303231343830385A300F300D0603551D1501010004030A0101302D020B51434130335F0203090301170D3230303132303231343830395A300F300D0603551D1501010004030A0101302D020B51434130335F0203090303170D3230303132303231343830395A300F300D0603551D1501010004030A0101302D020B51434130335F0203090400170D3230303132303231343831305A300F300D0603551D1501010004030A0101302D020B51434130335F0203090404170D3230303132303231343831305A300F300D0603551D1501010004030A0101302D020B51434130335F0203090407170D3230303132303231343831305A300F300D0603551D1501010004030A0101302D020B51434130335F0203090509170D3230303132303231343831315A300F300D0603551D1501010004030A0101302D020B51434130335F0203090600170D3230303132303231343831315A300F300D0603551D1501010004030A0101302D020B51434130335F0203090702170D3230303132303231343831315A300F300D0603551D1501010004030A0101302D020B51434130335F0203090704170D3230303132303231343831325A300F300D0603551D1501010004030A0101302D020B51434130335F0203090800170D3230303132303231343831325A300F300D0603551D1501010004030A0101302D020B51434130335F0203090805170D3230303132303231343831325A300F300D0603551D1501010004030A0101302D020B51434130335F0203090902170D3230303132303231343831335A300F300D0603551D1501010004030A0101302D020B51434130335F0203090903170D3230303132303231343831335A300F300D0603551D1501010004030A0101302D020B51434130335F0203090905170D3230303132303231343831345A300F300D0603551D1501010004030A0101302D020B51434130335F0203090906170D3230303132303231343831345A300F300D0603551D1501010004030A0101302D020B51434130335F0203090909170D3230303132303231343831345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000003170D3230303132303231343831355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000103170D3230303132303231343831355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000104170D3230303132303231343831355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000106170D3230303132303231343831365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000109170D3230303132303231343831365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000200170D3230303132303231343831375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000207170D3230303132303231343831375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000304170D3230303132303231343831375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000305170D3230303132303231343831385A300F300D0603551D1501010004030A0101302D020B51434130335F0204000306170D3230303132303231343831385A300F300D0603551D1501010004030A0101302D020B51434130335F0204000307170D3230303132303231343831385A300F300D0603551D1501010004030A0101302D020B51434130335F0204000308170D3230303132303231343831395A300F300D0603551D1501010004030A0101302D020B51434130335F0204000401170D3230303132303231343831395A300F300D0603551D1501010004030A0101302D020B51434130335F0204000403170D3230303132303231343832305A300F300D0603551D1501010004030A0101302D020B51434130335F0204000404170D3230303132303231343832305A300F300D0603551D1501010004030A0101302D020B51434130335F0204000406170D3230303132303231343832305A300F300D0603551D1501010004030A0101302D020B51434130335F0204000409170D3230303132303231343832315A300F300D0603551D1501010004030A0101302D020B51434130335F0204000500170D3230303132303231343832315A300F300D0603551D1501010004030A0101302D020B51434130335F0204000501170D3230303132303231343832315A300F300D0603551D1501010004030A0101302D020B51434130335F0204000505170D3230303132303231343832325A300F300D0603551D1501010004030A0101302D020B51434130335F0204000507170D3230303132303231343832325A300F300D0603551D1501010004030A0101302D020B51434130335F0204000606170D3230303132303231343832335A300F300D0603551D1501010004030A0101302D020B51434130335F0204000608170D3230303132303231343832335A300F300D0603551D1501010004030A0101302D020B51434130335F0204000609170D3230303132303231343832335A300F300D0603551D1501010004030A0101302D020B51434130335F0204000702170D3230303132303231343832345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000705170D3230303132303231343832345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000708170D3230303132303231343832345A300F300D0603551D1501010004030A0101302D020B51434130335F0204000806170D3230303132303231343832355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000809170D3230303132303231343832355A300F300D0603551D1501010004030A0101302D020B51434130335F0204000900170D3230303132303231343832365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000901170D3230303132303231343832365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000907170D3230303132303231343832365A300F300D0603551D1501010004030A0101302D020B51434130335F0204000908170D3230303132303231343832375A300F300D0603551D1501010004030A0101302D020B51434130335F0204000909170D3230303132303231343832375A300F300D0603551D1501010004030A0101302D020B51434130335F0204010003170D3230303132303231343832375A300F300D0603551D1501010004030A0101302D020B51434130335F0204010004170D3230303132303231343832385A300F300D0603551D1501010004030A0101302D020B51434130335F0204010006170D3230303132303231343832385A300F300D0603551D1501010004030A0101302D020B51434130335F0204010100170D3230303132303231343832395A300F300D0603551D1501010004030A0101302D020B51434130335F0204010203170D3230303132303231343832395A300F300D0603551D1501010004030A0101302D020B51434130335F0204010206170D3230303132303231343832395A300F300D0603551D1501010004030A0101302D020B51434130335F0204010209170D3230303132303231343833305A300F300D0603551D1501010004030A0101302D020B51434130335F0204010300170D3230303132303231343833305A300F300D0603551D1501010004030A0101302D020B51434130335F0204010303170D3230303132303231343833305A300F300D0603551D1501010004030A0101302D020B51434130335F0204010305170D3230303132303231343833315A300F300D0603551D1501010004030A0101302D020B51434130335F0204010308170D3230303132303231343833315A300F300D0603551D1501010004030A0101302D020B51434130335F0204010406170D3230303132303231343833325A300F300D0603551D1501010004030A0101302D020B51434130335F0204010500170D3230303132303231343833325A300F300D0603551D1501010004030A0101302D020B51434130335F0204010503170D3230303132303231343833325A300F300D0603551D1501010004030A0101302D020B51434130335F0204010505170D3230303132303231343833335A300F300D0603551D1501010004030A0101302D020B51434130335F0204010601170D3230303132303231343833335A300F300D0603551D1501010004030A0101302D020B51434130335F0204010602170D3230303132303231343833335A300F300D0603551D1501010004030A0101302D020B51434130335F0204010604170D3230303132303231343833345A300F300D0603551D1501010004030A0101302D020B51434130335F0204010608170D3230303132303231343833345A300F300D0603551D1501010004030A0101302D020B51434130335F0204010700170D3230303132303231343833355A300F300D0603551D1501010004030A0101302D020B51434130335F0204010801170D3230303132303231343833355A300F300D0603551D1501010004030A0101302D020B51434130335F0204010805170D3230303132303231343833355A300F300D0603551D1501010004030A0101302D020B51434130335F0204010900170D3230303132303231343833365A300F300D0603551D1501010004030A0101302D020B51434130335F0204010905170D3230303132303231343833365A300F300D0603551D1501010004030A0101302D020B51434130335F0204010908170D3230303132303231343833365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020007170D3230303132303231343833375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020100170D3230303132303231343833375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020102170D3230303132303231343833385A300F300D0603551D1501010004030A0101302D020B51434130335F0204020105170D3230303132303231343833385A300F300D0603551D1501010004030A0101302D020B51434130335F0204020106170D3230303132303231343833385A300F300D0603551D1501010004030A0101302D020B51434130335F0204020207170D3230303132303231343833395A300F300D0603551D1501010004030A0101302D020B51434130335F0204020209170D3230303132303231343833395A300F300D0603551D1501010004030A0101302D020B51434130335F0204020302170D3230303132303231343834305A300F300D0603551D1501010004030A0101302D020B51434130335F0204020304170D3230303132303231343834305A300F300D0603551D1501010004030A0101302D020B51434130335F0204020308170D3230303132303231343834305A300F300D0603551D1501010004030A0101302D020B51434130335F0204020309170D3230303132303231343834315A300F300D0603551D1501010004030A0101302D020B51434130335F0204020401170D3230303132303231343834315A300F300D0603551D1501010004030A0101302D020B51434130335F0204020406170D3230303132303231343834315A300F300D0603551D1501010004030A0101302D020B51434130335F0204020501170D3230303132303231343834325A300F300D0603551D1501010004030A0101302D020B51434130335F0204020503170D3230303132303231343834325A300F300D0603551D1501010004030A0101302D020B51434130335F0204020504170D3230303132303231343834335A300F300D0603551D1501010004030A0101302D020B51434130335F0204020602170D3230303132303231343834335A300F300D0603551D1501010004030A0101302D020B51434130335F0204020603170D3230303132303231343834335A300F300D0603551D1501010004030A0101302D020B51434130335F0204020605170D3230303132303231343834345A300F300D0603551D1501010004030A0101302D020B51434130335F0204020607170D3230303132303231343834345A300F300D0603551D1501010004030A0101302D020B51434130335F0204020609170D3230303132303231343834345A300F300D0603551D1501010004030A0101302D020B51434130335F0204020701170D3230303132303231343834355A300F300D0603551D1501010004030A0101302D020B51434130335F0204020702170D3230303132303231343834355A300F300D0603551D1501010004030A0101302D020B51434130335F0204020704170D3230303132303231343834365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020706170D3230303132303231343834365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020709170D3230303132303231343834365A300F300D0603551D1501010004030A0101302D020B51434130335F0204020805170D3230303132303231343834375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020807170D3230303132303231343834375A300F300D0603551D1501010004030A0101302D020B51434130335F0204020902170D3230303132303231343834385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030001170D3230303132303231343834385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030002170D3230303132303231343834385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030003170D3230303132303231343834395A300F300D0603551D1501010004030A0101302D020B51434130335F0204030005170D3230303132303231343834395A300F300D0603551D1501010004030A0101302D020B51434130335F0204030006170D3230303132303231343834395A300F300D0603551D1501010004030A0101302D020B51434130335F0204030102170D3230303132303231343835305A300F300D0603551D1501010004030A0101302D020B51434130335F0204030106170D3230303132303231343835305A300F300D0603551D1501010004030A0101302D020B51434130335F0204030200170D3230303132303231343835315A300F300D0603551D1501010004030A0101302D020B51434130335F0204030202170D3230303132303231343835315A300F300D0603551D1501010004030A0101302D020B51434130335F0204030205170D3230303132303231343835315A300F300D0603551D1501010004030A0101302D020B51434130335F0204030207170D3230303132303231343835325A300F300D0603551D1501010004030A0101302D020B51434130335F0204030208170D3230303132303231343835325A300F300D0603551D1501010004030A0101302D020B51434130335F0204030301170D3230303132303231343835335A300F300D0603551D1501010004030A0101302D020B51434130335F0204030303170D3230303132303231343835335A300F300D0603551D1501010004030A0101302D020B51434130335F0204030402170D3230303132303231343835335A300F300D0603551D1501010004030A0101302D020B51434130335F0204030403170D3230303132303231343835345A300F300D0603551D1501010004030A0101302D020B51434130335F0204030409170D3230303132303231343835345A300F300D0603551D1501010004030A0101302D020B51434130335F0204030500170D3230303132303231343835355A300F300D0603551D1501010004030A0101302D020B51434130335F0204030503170D3230303132303231343835355A300F300D0603551D1501010004030A0101302D020B51434130335F0204030505170D3230303132303231343835355A300F300D0603551D1501010004030A0101302D020B51434130335F0204030506170D3230303132303231343835365A300F300D0603551D1501010004030A0101302D020B51434130335F0204030602170D3230303132303231343835365A300F300D0603551D1501010004030A0101302D020B51434130335F0204030604170D3230303132303231343835365A300F300D0603551D1501010004030A0101302D020B51434130335F0204030700170D3230303132303231343835375A300F300D0603551D1501010004030A0101302D020B51434130335F0204030702170D3230303132303231343835375A300F300D0603551D1501010004030A0101302D020B51434130335F0204030704170D3230303132303231343835385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030708170D3230303132303231343835385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030802170D3230303132303231343835385A300F300D0603551D1501010004030A0101302D020B51434130335F0204030908170D3230303132303231343835395A300F300D0603551D1501010004030A0101302D020B51434130335F0204040001170D3230303132303231343835395A300F300D0603551D1501010004030A0101302D020B51434130335F0204040003170D3230303132303231343930305A300F300D0603551D1501010004030A0101302D020B51434130335F0204040005170D3230303132303231343930305A300F300D0603551D1501010004030A0101302D020B51434130335F0204040006170D3230303132303231343930305A300F300D0603551D1501010004030A0101302D020B51434130335F0204040008170D3230303132303231343930315A300F300D0603551D1501010004030A0101302D020B51434130335F0204040009170D3230303132303231343930315A300F300D0603551D1501010004030A0101302D020B51434130335F0204040100170D3230303132303231343930325A300F300D0603551D1501010004030A0101302D020B51434130335F0204040103170D3230303132303231343930325A300F300D0603551D1501010004030A0101302D020B51434130335F0204040106170D3230303132303231343930325A300F300D0603551D1501010004030A0101302D020B51434130335F0204040206170D3230303132303231343930335A300F300D0603551D1501010004030A0101302D020B51434130335F0204040301170D3230303132303231343930335A300F300D0603551D1501010004030A0101302D020B51434130335F0204040302170D3230303132303231343930335A300F300D0603551D1501010004030A0101302D020B51434130335F0204040305170D3230303132303231343930345A300F300D0603551D1501010004030A0101302D020B51434130335F0204040306170D3230303132303231343930345A300F300D0603551D1501010004030A0101302D020B51434130335F0204040404170D3230303132303231343930355A300F300D0603551D1501010004030A0101302D020B51434130335F0204040407170D3230303132303231343930355A300F300D0603551D1501010004030A0101302D020B51434130335F0204040501170D3230303132303231343930355A300F300D0603551D1501010004030A0101302D020B51434130335F0204040504170D3230303132303231343930365A300F300D0603551D1501010004030A0101302D020B51434130335F0204040602170D3230303132303231343930365A300F300D0603551D1501010004030A0101302D020B51434130335F0204040604170D3230303132303231343930375A300F300D0603551D1501010004030A0101302D020B51434130335F0204040605170D3230303132303231343930375A300F300D0603551D1501010004030A0101302D020B51434130335F0204040606170D3230303132303231343930375A300F300D0603551D1501010004030A0101302D020B51434130335F0204040700170D3230303132303231343930385A300F300D0603551D1501010004030A0101302D020B51434130335F0204040705170D3230303132303231343930385A300F300D0603551D1501010004030A0101302D020B51434130335F0204040803170D3230303132303231343930395A300F300D0603551D1501010004030A0101302D020B51434130335F0204040909170D3230303132303231343930395A300F300D0603551D1501010004030A0101302D020B51434130335F0204050001170D3230303132303231343930395A300F300D0603551D1501010004030A0101302D020B51434130335F0204050006170D3230303132303231343931305A300F300D0603551D1501010004030A0101302D020B51434130335F0204050102170D3230303132303231343931305A300F300D0603551D1501010004030A0101302D020B51434130335F0204050104170D3230303132303231343931305A300F300D0603551D1501010004030A0101302D020B51434130335F0204050109170D3230303132303231343931315A300F300D0603551D1501010004030A0101302D020B51434130335F0204050200170D3230303132303231343931315A300F300D0603551D1501010004030A0101302D020B51434130335F0204050508170D3230303132303231343931325A300F300D0603551D1501010004030A0101302D020B51434130335F0204050609170D3230303132303231353031325A300F300D0603551D1501010004030A0101302702053130313437170D3230303133313039313331335A300F300D0603551D1501010004030A0101302D020B51434130335F0204080005170D3230303231303131343733375A300F300D0603551D1501010004030A0104302D020B51434130335F0106000309170D3230303231303133343535315A300F300D0603551D1501010004030A0101302D020B51434130335F0105080600170D3230303231343038323133355A300F300D0603551D1501010004030A01043026020439383139170D3230303231373039333332385A300F300D0603551D1501010004030A0101302D020B51434130335F0206080005170D3230303231383131323031335A300F300D0603551D1501010004030A01013026020437303233170D3230303231383131323133375A300F300D0603551D1501010004030A0101302D020B51434130335F0102020100170D3230303231383135313534375A300F300D0603551D1501010004030A0104302D020B51434130335F0109070001170D3230303231393230333135345A300F300D0603551D1501010004030A0105302D020B51434130335F0207070501170D3230303232313039323832365A300F300D0603551D1501010004030A0101302D020B51434130335F0206020709170D3230303330323132313533375A300F300D0603551D1501010004030A0104302D020B51434130335F0103020900170D3230303330323132313634385A300F300D0603551D1501010004030A0104302D020B51434130335F0206070000170D3230303330323132313830315A300F300D0603551D1501010004030A01053026020436323036170D3230303330353130323932375A300F300D0603551D1501010004030A01013026020433333235170D3230303330353130323933385A300F300D0603551D1501010004030A01013026020431323035170D3230303330353130323934395A300F300D0603551D1501010004030A01013026020431323732170D3230303330353130333030325A300F300D0603551D1501010004030A0101302702053130323039170D3230303330353130333031385A300F300D0603551D1501010004030A0101302D020B51434130335F0203020704170D3230303330353130333033385A300F300D0603551D1501010004030A0101302D020B51434130335F0204080705170D3230303330353130333035395A300F300D0603551D1501010004030A01013026020431323833170D3230303330353130343634335A300F300D0603551D1501010004030A01013026020431333333170D3230303330353130343635345A300F300D0603551D1501010004030A01013026020431323939170D3230303330353130343730345A300F300D0603551D1501010004030A0101302D020B51434130335F0105020401170D3230303330353130343731335A300F300D0603551D1501010004030A0101302D020B51434130335F0105090800170D3230303330353130343733325A300F300D0603551D1501010004030A0101302D020B51434130335F0106040907170D3230303330353130343734335A300F300D0603551D1501010004030A0101302D020B51434130335F0200060802170D3230303330353130343735345A300F300D0603551D1501010004030A0101302D020B51434130335F0200070807170D3230303330353130343830345A300F300D0603551D1501010004030A0101302D020B51434130335F0105080905170D3230303330353131333834315A300F300D0603551D1501010004030A01053026020436393333170D3230303330353131343034355A300F300D0603551D1501010004030A0105302D020B51434130335F0207050607170D3230303330363133343135375A300F300D0603551D1501010004030A0104302D020B51434130335F0103070504170D3230303330393039303030315A300F300D0603551D1501010004030A0101302D020B51434130335F0208070608170D3230303331363135323330305A300F300D0603551D1501010004030A01043026020432343134170D3230303331393038353132305A300F300D0603551D1501010004030A0101302D020B51434130335F0105030106170D3230303331393038353132375A300F300D0603551D1501010004030A0101302D020B51434130335F0209070202170D3230303430373131313031305A300F300D0603551D1501010004030A0105302D020B51434130335F0209080109170D3230303430383030333430335A300F300D0603551D1501010004030A0104302702053131303333170D3230303431323131313931315A300F300D0603551D1501010004030A0105302D020B51434130335F0208060309170D3230303431323131333335305A300F300D0603551D1501010004030A0101302D020B51434130335F0106090001170D3230303431323131333535355A300F300D0603551D1501010004030A0101302702053131313538170D3230303431323131333730315A300F300D0603551D1501010004030A0101302D020B51434130335F0105020707170D3230303431323131333732305A300F300D0603551D1501010004030A0101302D020B51434130335F0200030708170D3230303431353133333330365A300F300D0603551D1501010004030A0105302D020B51434130335F0108010702170D3230303432303039353232335A300F300D0603551D1501010004030A0104302702053131333736170D3230303432323132343231325A300F300D0603551D1501010004030A0101302D020B51434130335F0203060707170D3230303432383133313330315A300F300D0603551D1501010004030A0101302D020B51434130335F0205010707170D3230303530383039343634305A300F300D0603551D1501010004030A01013026020437303835170D3230303531393037333931395A300F300D0603551D1501010004030A01053026020437303932170D3230303531393037333932375A300F300D0603551D1501010004030A0105302D020B51434130335F0105050604170D3230303532383037323033365A300F300D0603551D1501010004030A0105302D020B51434130335F0104040300170D3230303532393131343635315A300F300D0603551D1501010004030A0101302D020B51434130335F0105010403170D3230303532393132343230385A300F300D0603551D1501010004030A0101302D020B51434130335F0302020006170D3230303630313132353830385A300F300D0603551D1501010004030A01013026020433313837170D3230303630313133313231335A300F300D0603551D1501010004030A0101302D020B51434130335F0103050403170D3230303630313133313433315A300F300D0603551D1501010004030A0101302D020B51434130335F0209030900170D3230303630323039333530315A300F300D0603551D1501010004030A0101302D020B51434130335F0109000401170D3230303630383038353930395A300F300D0603551D1501010004030A0105302D020B51434130335F0207070604170D3230303630383039303130335A300F300D0603551D1501010004030A0105302D020B51434130335F0203080803170D3230303630383039353435355A300F300D0603551D1501010004030A0105302D020B51434130335F0200000909170D3230303631363133313333355A300F300D0603551D1501010004030A0104302D020B51434130335F0202060504170D3230303631363133323231365A300F300D0603551D1501010004030A0101302D020B51434130335F0302070509170D3230303631393038313130355A300F300D0603551D1501010004030A01013026020437343930170D3230303631393132313034335A300F300D0603551D1501010004030A0101302D020B51434130335F0103030104170D3230303632353037353830355A300F300D0603551D1501010004030A0101302D020B51434130335F0105060003170D3230303632363039303433355A300F300D0603551D1501010004030A0101302D020B51434130335F0204090804170D3230303632363133313435315A300F300D0603551D1501010004030A0105302D020B51434130335F0202040901170D3230303633303039313234345A300F300D0603551D1501010004030A0101302D020B51434130335F0107010409170D3230303730313131323230345A300F300D0603551D1501010004030A0101302D020B51434130335F0107010408170D3230303730313131323233325A300F300D0603551D1501010004030A0101302702053130393830170D3230303730323039353032345A300F300D0603551D1501010004030A0101302D020B51434130335F0208090202170D3230303730323039353131305A300F300D0603551D1501010004030A0101302D020B51434130335F0301010703170D3230303730323039353132305A300F300D0603551D1501010004030A0101302D020B51434130335F0302070008170D3230303730323131303333305A300F300D0603551D1501010004030A01013026020432373035170D3230303730323134343234395A300F300D0603551D1501010004030A0101A030302E301F0603551D2304183016801474627099FF1B603BC464B5841FA3150C5CCB5FBD300B0603551D140404020209E2300D06092A864886F70D01010B050003820201009ACB2F9ED10767FEEF30E615A6B24AD45AE5F648B45F9D3B15C3CEB331585B3C6077CD116CC689CDD3DC3812A6E4E1C5395FB8C2F5CE97F3AD24D090FA3E3B5841C7C5610F72625D609B91DB193F5ED1931637DD819454E911501E15DDC4F4E1C4D9E08EC760191A9A8DFE823758D02ED8C98D0B66D0FA28E79CCA5B1C9A931CF5F93B411B2468090C0C84E6129A86938E09CBF02B750602E2E397CCB6365C2585F7A0FBB575C101A938B2C52A009D0F2F3BFEC05F891132159667D359EF5117F51B6458C7D68DECFEBF7E04683002F0797B444E02A50EC2A8ACFADF5A3A743CCEF17214F2657439A02DFEA66F5EF8CA4C576C8F7FF8EC4CA08F9FC3A46A0C10343CDF28B092CE03905E87BFC19B23C49F655AA99198CF58F80D0E3AB1800494D21CB610CE155230987A673F8E3580012E363F9A8103ADFA5EB6A0DD5575E78EC93A626585877FA2A91A39AC32BF3AD7E3D82824ADF1157B2E8B79285B08C5800FA6FF97AAE6194B1BB9A92E27D57BF7F439AC2D32612BA7B6775E6EE05389DEA2976896BA57EC4577EBC27B2CAE7716391EA73B9E1E2F8C158DED624383533129691AFB9C8CEEF16F29988DED179886060FCFE5C1A843D94555EE4A9B1F24C7D4D4B0581621E75E6A963334B37C57EB369D3DC27B348B8CD8686E1D2059BBDCD61D9C6E0FED2BFAA32847F33E84FEA3056381199B7766DDF123FD148942C8C0300D06092A864886F70D01010B0500048201802ACBFB8158F5D6D5D44714C61B26A8CF619A9243B4E7A40FAEA7A8988994F67E17056D4D58BFD8BF3B56B4D88F4A86658F2B0CBC83376E1B25975DC2928353C3D0B8C1C5F6A3304AF60D8A64D552E2D48A5EED88C0FA9FC5E97D255DF8730A2EA207EA58033D00387916359EC6049E8577C0009467F4F801A8B4D0A3289282D11B8B4E237F5F3F104DFBF18B1C00145073CD9E0113646C73C347E8F121D33530A3D80C3E965E523EA368C6A9D9DA71FE1B3A5A0DEA901733356B4099F0F9859D567EFC3B27B8D09030D441067A7F68898AF59D0998CC57B8D9D4BE12477B86E3B5EF5628F0255F377F4F0E15F849EB683123A89AD04836D111715C051DA54FE396B1565B09DBE0FECC33E41373CDB186A97509FD92FE22DAFF2F43240D2B9F57D29C8958585AC60B68A686F457945388DA9983DFB48EF0D2179115424B509977B68722F0576C989ADA21B6563D30A6B104427C355281B0EE6FE88E65A3063B09527F8A93A07D2A4323BCD492DC598DA4FB460868F198BC25FB36B1432FFE053D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000> +/Filter /Adobe.PPKLite +/M (D:20200706133807+02'00') +/Name <FEFF00410044005200490041004E00410020004500570045004C0049004E00410020004D00450044005901430053004B0041> +/Prop_Build << +/App << +/Name /Adobe#20Acrobat#20Reader#20DC +/OS [/Win] +/R 1313024 +/REx (2020.009.20067) +/TrustedMode true +>> +/Filter << +/Date (May 4 2020 00:13:06) +/Name /Adobe.PPKLite +/R 131104 +/V 2 +>> +/PubSec << +/Date (May 4 2020 00:13:06) +/NonEFontNoWarn true +/R 131105 +>> +>> +/SubFilter /adbe.pkcs7.detached +/Type /Sig +>> +endobj +23 0 obj +<< +/Length 2094 +/Filter /FlateDecode +>> +stream
+HWKo7{MFh@j7#q#w#o_*cDаf+v]__X11na_^.{`&.={xsyػˋˋ=0˃e?]^ +99PiS2fX +fOqf
YӮ[3w1
:u1efNcB~Ɍ"+nUa%|-,Uuf<F9 +\0c!!) +P*#C'NkO:7:zeQLGuܔtmX<oTHXd!b}
:bHF HYr?:JnȒ8~ X&`JaG6##Gd)y/6tMl' +v1,( + +4n\ьm˺T&Q
heLI\܅DV!6Lk`´ah->Dƃ +LbBUaJQUDA*l*_pRI2SEL"q5l{BJ#Psp4YLќ]+FH4F(GZF"q\HT`3U+8 >:kbcf^j`ӟyJNH-ŒA(jȖ$*$Z<rJ.k/JmGA9+C7`nAr_%n-LܠEM@&*j$>>qyQ7Mb~ +i NҶ,'qgsLG]oP3jݏY +־8k<N{0v]__Xa3[gvcU\o|6wyS +endstream +endobj +24 0 obj +<< +/Length 1924 +/Filter /FlateDecode +>> +stream
+HW[o6~7GiX)ı
+aPH$] h~9$m6fڠIQhl)f ,Xa\v~u4hXhooGPh/@z#yn/f~bG2 +Z=pDLyj7Ubsƞd^=c;=RVM(k<}Aۆ{İC-viRZiMIZr;A~1C֒#n>otAS. cCx_۾vin\d4;liFh&O)⽹'z[9EHfMEQ:ɯfJzYxQYJUN_50ޔ{Rj/ߴo/[\6˶s-\_;xÇwemgⵏBѭd:.icR&ٱ(K8 +tB?vpUDn$h=JWS澮;)EwT)
Mm)5(h(p.( -d⋙+[ٺڼ4ڰk( `אElI +Tab)IQjqT__3rI5bI$Am +mvm4^GO7ZYw856Ix]Pʥk-|ǀcO6
n3,Dj'G-W7FA,L% Ӭ+ +I5gL5{FV⚪Bmrmf+5*(6ZDA䭖[] +}a뀴u#+or\WÌG[_U5~a~&/v?\Ӱ4lU%{LQ$We_b\WI)$T?DI)4%^yJ̨|Ʊ:@x +F}NW
rSzVR +RhATq@b +:7].+cKzō.1?mE2ﱾ?_L9tj~njyv/Of.Бfu< !,D[M"$3aS<BH4d2eOFd|?pNy Dx2,j[ILOG +endstream +endobj +25 0 obj +<< +/Length 1762 +/Filter /FlateDecode +>> +stream
+HWKo6/AUe"X d::wҒ^g87srqr\\\PBi-ECeፑr\Ca8駧Du傁(mX`a\b_Y5wZꈝ[q(a c;ƚ4`cV\ki<q@%P܁gͺ_|6k=xN(w)߬vNLwS-mtփ6JĪ6TNƹόh}[-sOni]q:;Hq}ɾx^oTJRk]gQ?!D䨳imX>F!zwc0c_T~Lv` N:Spnq NfJ7$LfB;jsM0ZWOrw~T톍\mӥ=$%cD]k +FeNVz훯X}F{WqKƞW8d(18NOOeu\>FE.~Fk +n6kP +Jsnr,%z&M+9ہʦ{R֦"@um) Ĩb>m3c9M9E*/irrnGn&]$ ϐ$-̈́H9|;LnQq=>uo7ޢE4Om={vo6q8919\T9@:~('`0i{G.$du~~e:#%<8Avo2M6^~-w2mh>(܇{3w̡rkAe,RP9S%vR-IA5ѥ
|&QI,˵b6iY0z0.ḷU:<. +}Ji\rLA+VIƕڥdJ`lҼFȾ]iU֝9DQ1oH^~0Y Cc>'92֯'0D +endstream +endobj +26 0 obj +<< +/Length 1859 +/Filter /FlateDecode +>> +stream
+HW[k7~_ǙQt3`@<y8'MSL뫣*%k6a3ڣs9tvsqLeAJ̐jynΜC +[._n7ԉD+&XStީCIKݘ퇛WFV^ϗ|'<'1%r!]
1N-GzBJXKֲedі<o+R]NI/G/ZAԝG\`K6.!wnIHXwnFwz{AekK+ "˖ 51$O{q/4N(=mg=mA/ӄ6Nl=9\-OCl"Z1qeNj)y {/Hʱ0D+I*eEZM\+qn%#SR4~,R|'.w=
<zrh[tvޡ1aaj> V +tiҨƒd5.Vn`ܼQ}{foE7Vn4Q3 +~unaהUo~e7Lp[0w{`{
o#<£y&9߃GaVT*a"k+Ҿj통)W҇>Bȱ\sge\ޥDaͷѕk7!gh=t]r#b39Y5lOa 3]"Qĕ,I#Iܱ$ml<m?O#2~p2AҩpNfed],4OOB(~ٔjݾo]prEj:jUic:?BB /GZPkOG:*%&hitU~G.<S3^R.M=%N%~=PbOnVN[RTa+_J
2NF33Zޒ-iK$T;lG*7ch6v,Z݂8c-t+itd,]XrDOBPLep*бhlxA#^o@c{!Glj.sC<6,Q](\ ~8<L +Nq< +x5eEWݜ+Ρnv}F'luӄ.x&r?
QzMTvRXAH3JyT:0& /Ϝ'P%ͮ%#1ϗ{qe3N\&@3:p߾.īczG6 R;2+f +endstream +endobj +27 0 obj +<< +/Length 1950 +/Filter /FlateDecode +>> +stream
+HWmk9nGzY9zh!>J[wzF/+i%Ǎ7)4w%hgm:ܮWo֫61#
QCXBWW%v~\,m#RЖD%8a^lOw +>Ilx^e[u}Kl + +-.j& +o<ׅ>xlNa,9g cwcb3 +@F^ΐ#܈Mp(J0)#qQWjTk5cGᾩo"(SRܟ3L;UIlB~16yΕTn|!A^Ny+XIeuEߣB*mh+J#k< +s)*VA>!@kryyq3ړ{rȹnI-mdmZz*TPevg)[Hvg6}݊Nn_chV=9*LR>xya}At
0ˆׇd>PQUVFEm%?08BOGˢ4Lu0u-/qј*a5c_m }ڪ͇-JJn>ov6ߡڽ[Ĵ+8 ++Au->=N2~le:]vZY:tIM0-dyOFM9采k>Nt +SFеi<(ZE[ +vg{۟ٲnZqT_\A}Zg-x +lygIT%SThbjcp\
Jzh=egH{kH&1f\ʊ#
e'%^˩ħ-(=l6SFH09Q0G='d=rS/D)[)(4f?<(݆yo9^`07JFŚyxb є젰bʝ!aFW2sS
"΄ %VlY$ 菖0HZx^ZP-3Gnv"Ȑ&+PqA'\@3$AF?B}O)U$B8],2@ɱOCm,F|6J }>.Y[ +bGc>~8(:ł~Cp~HSbƌފYΥ'fr=FX*_)% D"ܐT,As#ێ''"5]N +endstream +endobj +28 0 obj +<< +/Length 1978 +/Filter /FlateDecode +>> +stream
+HW[O7~_Ǚc|[B#V)R&4&=xC`\;: !vPJ᳗#~uLç2Q_.χ/GˣͯG5&GkeAH̐khtw9[6 +]y XPĹ&uԮaלӪswDn8(e>ܜ=|q>[8:vKǪ=n83XTeu.^F''ǯƟϑÀGt1$pkCݣ뷍<r XÚV$X;y< +Tm[]kkZ؈C\hzyklmO@ +8O/tU^
wٺN"> +<tWv X;"9#3~KhN5$X ,E
0jS\nWpp0B!r1\]312㺌u%9BF_WHa@g#:\0<yvԁa{tyQɒJV*egoX{j+;=CIFTOr%9+GЭ'=Ѝn]JD_̮@'6֊LDgtyJ9QqZ BDzTWd5Ɉ»L䱚ĝ't.ݙBvGJj.YxeܟphiN6S=lv{bxo3U32'Y4&ºB{G.*8^;Mx>($EUN ހip,m595}!P@7A1S
ra+R*z p/
ų!ɪt3(ާ(%GPZeg +6kJ%tvKX T*q*qzY<y2AZ'A\fߟ.@,EKȳ+O_&/r +ӧ.GU9B䜽2QbQtŔᎧ#CY)G
CUaH6w~jQ.mDd٬@OUhSF +OLqq>%j`> ;a/xkjXy +M a)kts{dЊ~hI@3pk^s13YŔ«醹[U"M}))m{ξd3OCköƭ"F_`?B|XZ +꽟YA +endstream +endobj +29 0 obj +<< +/Length 2000 +/Filter /FlateDecode +>> +stream
+HWnF}G +٢FgV
5iC|+:nICjhzNp{kRsjr5k~C7?-V`gA7?" l20)Gk,П⮬T|/kɊJKUˊeR+hЃ}>ٔŻRTiTVמrw8IuʋNڪrB:!\-J(TP_ZjZFWWAW-:&0lx&b`3=.fkV
=/nYMfGA̚ +rV#lIT`-1 jy9Mh$Vz⍥?>> +K2=^?! 3j0ln`ƆL1-U!+A~x= xxѾP%ϹY})pljH@9 C`H\"['î.*"" #YM7I,';"FuK} ^n0OenRT-˥*o +wlxV[~B3ޛX̻RMc#v7x^GLpVbt}sP=QNU锲)l)<-x`1MXqO#]H7NZ@0xn,hsVZUAW-: #*im7JsUfEMV.].IW=JW{2-}`t0ؗۮ1:v܂}"oJ_JJVJG)ҙRvgC85K$;rU{8o쀗jDID:PEd-dHc.3Jok9/ hU5+b2ʯ,AaٿByitdz'oy_(؞7nIC ݓmCB\=r餿>,v</
Q) +J2ҍ!5rf4{nw<3HpI7cf I2, +endstream +endobj +30 0 obj +<< +/Length 1872 +/Filter /FlateDecode +>> +stream
+HW[k7~_0;#2
{[bHЇqBnH
8rsVo_W|,](u]- +Z4}Cx!kFdq^GYѲa(Nb:ډB-.ޮWӂ!u +NK6{U3rXS{x6(Z>5Uë̅7ߚ*;U=D+6;e^w4hus
Ypu*{V1'o +Fi U@AܲYr_MDĐ*[A_MDM#QU6*i0\']&H&FWZTfqlZ Ű ^aRX%J043~Tsמ8m褭k#zF$Zrr H5Q8rgbғr6@a|]@&h75w:Y#ŋz"aKW +\vcb?㨉ȺEK6LYZSݺ((UMѥjcάy&B5 ߪ)v'59Tsc<֢'5gC<pHjT*ǗgEˇ8=ykR4#Hh2M1FGAbqfH_H=Ĉ,Ɂ@8X# +sn٤ZǯޗpO:xijŌ+8*YD/fUqU'L=l20~ࢉ0 +$BSzaI\ClRv-=r[Gx@dZ|'@6kX6QڡFw.{"Hܹފ
Cw4XOΚpNGN=zKN4r$8FԎc`mgp +c
6ʣsha#CuCP35iLENXU95mЗgB䵉0N5%L锇|%*L'P.6%L()/qxF9<oSN(`,3z~4dHgs*k|'w^,wiOǕ)\&~6^, $ciǀyd55H2GX,;MM'R\蠮+:VgQ/
fȼu01tzIlTwKN5yzh~}8#٨23bJ<5״#AlD֤~;0|Ak 3"\Vrs ,0(
Rn-z7cYw|k_?<pC^VL|/PFKå~s G-^R*?gq{ǘ:=yuԌ?qѩ$z])d>~餆4 +endstream +endobj +31 0 obj +<< +/BM /Normal +/Type /ExtGState +/ca 1 +>> +endobj +32 0 obj +<< +/BM /Normal +/CA 1 +/Type /ExtGState +>> +endobj +33 0 obj +<< +/BaseFont /BCDEEE+Calibri-Bold +/DescendantFonts [145 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 146 0 R +/Type /Font +>> +endobj +34 0 obj +<< +/BaseFont /BCDFEE+Calibri-Bold +/Encoding /WinAnsiEncoding +/FirstChar 32 +/FontDescriptor 147 0 R +/LastChar 122 +/Name /F2 +/Subtype /TrueType +/Type /Font +/Widths [226 0 0 0 0 0 0 0 0 0 +0 0 258 306 267 0 507 507 507 507 +507 507 507 507 507 0 276 0 0 0 +0 0 0 606 0 529 0 488 459 637 +0 0 0 547 423 874 659 676 532 0 +0 473 495 0 0 906 0 520 0 0 +0 0 0 0 0 494 0 418 537 503 +0 474 0 246 255 480 246 813 537 538 +0 537 355 399 347 537 0 745 0 474 +397] +>> +endobj +35 0 obj +<< +/BaseFont /BCDGEE+Calibri +/Encoding /WinAnsiEncoding +/FirstChar 32 +/FontDescriptor 148 0 R +/LastChar 122 +/Name /F3 +/Subtype /TrueType +/Type /Font +/Widths [226 0 0 0 0 0 0 0 303 303 +0 0 250 306 252 0 507 507 507 507 +507 507 507 507 507 507 268 268 0 0 +0 0 0 0 0 0 0 488 0 631 +0 252 0 0 0 0 646 662 517 0 +543 459 487 0 0 890 0 0 0 0 +0 0 0 0 0 479 525 423 525 498 +305 471 525 230 239 455 230 799 525 527 +525 0 349 391 335 525 0 715 0 453 +395] +>> +endobj +36 0 obj +<< +/BaseFont /BCDHEE+Calibri +/DescendantFonts [149 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 150 0 R +/Type /Font +>> +endobj +37 0 obj +<< +/BaseFont /ArialMT +/Encoding /WinAnsiEncoding +/FirstChar 32 +/FontDescriptor 151 0 R +/LastChar 32 +/Name /F5 +/Subtype /TrueType +/Type /Font +/Widths [278] +>> +endobj +38 0 obj +<< +/BaseFont /BCDIEE+Wingdings-Regular +/DescendantFonts [152 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 153 0 R +/Type /Font +>> +endobj +39 0 obj +<< +/BaseFont /TimesNewRomanPSMT +/Encoding /WinAnsiEncoding +/FirstChar 32 +/FontDescriptor 154 0 R +/LastChar 32 +/Name /F7 +/Subtype /TrueType +/Type /Font +/Widths [250] +>> +endobj +40 0 obj +<< +/Length 4181 +/Filter /FlateDecode +>> +stream
+x]o.@~+ orQA|m4EEu__]@rwp2L_|ӄWO鿷7a'<Y :iN>yۛ/lhOd3rRl4[6w_~y{3Z|we79D8XX߭3h%-Z(po /l1Lp7㧇;{53ω4<dC\Lcbս}yPAl[ r;q
:0/m6ϘP~.^*75 F[KF082D`tk9z%+(4h9ԛU[/UvY3t6{r0T2H]L~,A$lh
+VDS$yCHj{Ò]`
3w\F@Bʀijxzr8z͡JK3]{T0uGhN",DYmj4}OZ) +'&0HHY-.8FCĎTKVa* +Z"'07InM]Jaƃ^CW @lHR +w"v%`ux[]"C}%.7ƌAVYNI ;stSgZ}0N)a-Wd5=.frlPDD̯%ڝ>Xi}-V_?]!kOehF"h<$
˱<-sEE]"J,lۄ-1Zh8eX< c}<4EWXcx\YP HhqThqs)_ֺ!,]h~TŝBUYR5pMYWsXuXm'z`݇A&&>cdpXt͓ج☉bS0Eu>h*@f"FxqCy`3ko|ke B#d8mw*RfiCoNP@x"Kf${d_HWwԏCʮ$-tvrʠ{[i^[F2Upjk";ƪ41y!}W^=y:JfC}XH@ +\!L99WJȧk"hWseChj\ WLPgKS4t98@eKCb} R5@ftD\ZX+s[;T(`$$k.K%#ǩN!
L]\-*A˴աVX]h5iyJ~6^$}EFRtjiEgq2x1Y"BWS瑘I]ݮ
j8BKcY+gb=dE2k7JYuuٟBֵ3AnGl +Z]:KJf`AiџhVMUlJDC5p95fѪٝ7fj{uK|(yG#Po%]=ߋfF u@*8wk +>v^bP$N3[PfNɒY:].d&G4ƦY/1#Vf3N? +lıT6
Si#EmX[n 4k`hqQ̸Cl|2qeVӃо]Ah&桐h>`NjPba;tw,n +嚉o~+c=%Y}~xc~dǥ28/?$iX{pv9<rTӵ{Xu`UkNnF[zm"ŢӪ<,:VY*kW`ǑaޘŝIlx(VI٤C?%;G$&BIG'&8%'xqR,Ȟ>"뷠WG86gԝ[JaȢJ?!M&Aqf
_>UgXcXdzkgvMOT]X;?σL5vVz: +mb{G|f{IRx&!+loҽXV0Y +W٘
͆0gNpA;A0ће-jk>zܹIg +$NM C +
+endstream +endobj +41 0 obj +<< +/ID (Note 1) +/K [131 0 R 132 0 R 133 0 R 134 0 R 135 0 R] +/P 17 0 R +/Pg 14 0 R +/S /Footnote +/Type /StructElem +>> +endobj +42 0 obj +<< +/K [100 0 R 101 0 R] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +43 0 obj +<< +/K [102 0 R] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +44 0 obj +<< +/K [103 0 R] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +45 0 obj +<< +/K [4] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +46 0 obj +<< +/K [5] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +47 0 obj +<< +/K [6] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +48 0 obj +<< +/K [7] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +49 0 obj +<< +/K [8] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +50 0 obj +<< +/K [9] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +51 0 obj +<< +/K [10] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +52 0 obj +<< +/K [11] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +53 0 obj +<< +/K [12] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +54 0 obj +<< +/K [104 0 R 105 0 R] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +55 0 obj +<< +/K [15] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +56 0 obj +<< +/K [16] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +57 0 obj +<< +/K [17] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +58 0 obj +<< +/K [18] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +59 0 obj +<< +/K [19] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +60 0 obj +<< +/K [20] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +61 0 obj +<< +/K [21] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +62 0 obj +<< +/K [22] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +63 0 obj +<< +/K [23] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +64 0 obj +<< +/K [24] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +65 0 obj +<< +/K [25] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +66 0 obj +<< +/K [26] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +67 0 obj +<< +/A 155 0 R +/K [156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R +166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R] +/P 17 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +68 0 obj +<< +/K [47] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +69 0 obj +<< +/K [48] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +70 0 obj +<< +/K [49] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +71 0 obj +<< +/K [50] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +72 0 obj +<< +/A 173 0 R +/K [174 0 R 175 0 R] +/P 17 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +73 0 obj +<< +/K [53] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +74 0 obj +<< +/K [54] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +75 0 obj +<< +/K [55] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +76 0 obj +<< +/K [57] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +77 0 obj +<< +/K [59] +/P 17 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +78 0 obj +<< +/K [2] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +79 0 obj +<< +/K [3] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +80 0 obj +<< +/K [4] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +81 0 obj +<< +/A 176 0 R +/K [177 0 R 178 0 R 179 0 R] +/P 17 0 R +/Pg 15 0 R +/S /L +/Type /StructElem +>> +endobj +82 0 obj +<< +/K [8] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +83 0 obj +<< +/K [9] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +84 0 obj +<< +/K [10] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +85 0 obj +<< +/K [11] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +86 0 obj +<< +/K [12] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +87 0 obj +<< +/K [13] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +88 0 obj +<< +/K [14] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +89 0 obj +<< +/A 180 0 R +/K [181 0 R 182 0 R] +/P 17 0 R +/Pg 15 0 R +/S /L +/Type /StructElem +>> +endobj +90 0 obj +<< +/K [17] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +91 0 obj +<< +/K [18] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +92 0 obj +<< +/K [19] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +93 0 obj +<< +/K [20] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +94 0 obj +<< +/K [21] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +95 0 obj +<< +/K [22] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +96 0 obj +<< +/K [23] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +97 0 obj +<< +/K [24] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +98 0 obj +<< +/K [25] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +99 0 obj +<< +/K [26] +/P 17 0 R +/Pg 15 0 R +/S /P +/Type /StructElem +>> +endobj +100 0 obj +<< +/K 0 +/P 42 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +101 0 obj +<< +/ActualText ( ) +/K [1] +/P 42 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +102 0 obj +<< +/ActualText ( ) +/K [2] +/P 43 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +103 0 obj +<< +/ActualText ( ) +/K [3] +/P 44 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +104 0 obj +<< +/K 13 +/P 54 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +105 0 obj +<< +/ActualText ( ) +/K [14] +/P 54 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +106 0 obj +<< +/K [27] +/P 156 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +107 0 obj +<< +/K [28] +/P 157 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +108 0 obj +<< +/K [29] +/P 158 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +109 0 obj +<< +/K [30] +/P 159 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +110 0 obj +<< +/K [31] +/P 160 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +111 0 obj +<< +/K [32] +/P 161 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +112 0 obj +<< +/K [33] +/P 162 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +113 0 obj +<< +/K 34 +/P 183 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +114 0 obj +<< +/K [35] +/P 184 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +115 0 obj +<< +/K [36] +/P 185 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +116 0 obj +<< +/K [37] +/P 186 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +117 0 obj +<< +/K [38] +/P 164 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +118 0 obj +<< +/K [39] +/P 165 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +119 0 obj +<< +/K [40] +/P 166 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +120 0 obj +<< +/K [41] +/P 167 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +121 0 obj +<< +/K [42] +/P 168 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +122 0 obj +<< +/K [43] +/P 169 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +123 0 obj +<< +/K [44] +/P 170 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +124 0 obj +<< +/K [45] +/P 171 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +125 0 obj +<< +/K [46] +/P 172 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +126 0 obj +<< +/K [51] +/P 174 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +127 0 obj +<< +/K 52 +/P 187 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +128 0 obj +<< +/K 56 +/P 188 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +129 0 obj +<< +/K 58 +/P 189 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +130 0 obj +<< +/K 60 +/P 190 0 R +/Pg 14 0 R +/S /Span +/Type /StructElem +>> +endobj +131 0 obj +<< +/K [61] +/P 41 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +132 0 obj +<< +/K [62] +/P 41 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +133 0 obj +<< +/K [63] +/P 41 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +134 0 obj +<< +/K [64] +/P 41 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +135 0 obj +<< +/K [65] +/P 41 0 R +/Pg 14 0 R +/S /P +/Type /StructElem +>> +endobj +136 0 obj +<< +/K [0] +/P 191 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +137 0 obj +<< +/K [1] +/P 192 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +138 0 obj +<< +/K [5] +/P 177 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +139 0 obj +<< +/K [6] +/P 178 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +140 0 obj +<< +/K [7] +/P 179 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +141 0 obj +<< +/K [15] +/P 181 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +142 0 obj +<< +/K [16] +/P 182 0 R +/Pg 15 0 R +/S /LBody +/Type /StructElem +>> +endobj +143 0 obj +<< +/Length 55207 +/Filter /FlateDecode +/Subtype /Type1C +>> +stream
+H\Vt_wvb)j!$<HB18M'̈́ٙdv$DkQQz*
RSBAJ)(H"E<jyH)̝YIf̢H( +j
E1r"J_<NGn`Af¶tN!>E0DX Cad$RLEJH5R#" iFd$t iEC
N/Q4r P[hzZA2ځ>cY/-m;ww]Iyڿοٿf + LM-p/8kՠ/(`O/JpKpOp!4Bq}PWКжо{ X!6Ucc ۀbاE5I6|8> +/Yxށw=c*x?߅GgWB!NB<b! B#SDKb=-#q8B'+u%q%#d9YBN%+r.9mdI|#_&_'7oȷCQy<G~N^#oP(ER5HMSUTu%QF^j%<OP;=A0u:E.S7уBN8m^z2^Oo;?{}}0!}>EB/We(f3Ōg1̴1bQf9$yyg^a~żlb2ۙf/9aN2+ +~aU! +'3?/ +`q8R-+N9bCQU1%.{ŕ/u-O~xTxA"~)/ +3pIpk3dxMx{)ȑ"/D6GG>\DQ:*FFGGESYhKԈvGWD<fY%f6K<?)cK␗D-NWbԮLCooMwyyUuKSפؗ6B`ҶT61)UJV
PK2&j<evnlvxE-zeI.RrD\$+VEi.1Y%D-i
gD4pLhN;a 6f%hp'b{,gB8ppT2<:oU=)u'x9tY6RJ"uJ['L6mqcIAC\`n}"DŽ,d]ӓIEoܤmLv[ߛ\vɰWry\Ekqfc[CY\7rȑEPndf#72rݤ-72r:<Z/u-8bB9dkv-:j:]u(#ŎrfҶve犹)#?.kzRѲxB<m'<C@G<8㉇q\_Klg<8㍷έqD9&&ɸF]1UJNFrR7aY/0)z@]Պ:Jײ
)&g7Bnb&-sb ~ɆI;Ғj%ckwPMi}MR-+V!VySԸbmc!YqIMc˪)%ԮHٰҤdJu.Vubŗ#NrWb0UW8pU8*\DqIITԸlb3s˪*wUSʩZTRupp">*QdqcKjak$\8~BXך1IUJuN:چ[ks!倊#O-).m==
pFX1W1XFJI5ZḊ1dܷu.(+`y`46k/gv6wǻcw}5Z"&*DIS +ITIQi+RJmRTU+4j@Q:s?{wJ0̹={h4-"F#,Q1d$&ܘɤ&3+垏W<:( 1D:k '&xR'gsp
lB:x-Xt:ӳ9)Xg5+BF,˺M<!u2?2YξBw2ǝ.Œ倈=9q1KQUܻ t?Mԝhu,XV:ct)*xJcNX= =#ց1EtZv3zl/qK[iKl
+N]ݩ3stSE@4s0\Ɛ3٘[K&=A$D%b~~ L[Lf)[ +M6r3 +gzvAEQvfEvBd̝On龍iQ9/_|."v)pPs6',6XA㥑i|4 +&@LBiQi4&,CC /A^y %K /A^!#G<y>|#G<y>|)))))))))))))))) 'O ?A~ 'O? AVN5Ԭ+#y%^v2o4'Wo4 +MFхQSSSSSSSӨӨӨӨӨӨӨӨQ.D]u!BԅөөөөөөөөS LAxh44A&DO@JJJJJJJFFFFFFFF]u!BԅQ.DNNNNNNNN]0a +A=]V۸mCva(w|X.SAlFx.'s2D>2CX𪳪ȝfTQM><)Lzf?^_qU棟I2Z7wHc4;sn'hy#,v,7cv='{;1qJnvȂ.\ӾQS1L8M;_&CSpD'SV,\^qmd#L{2|sdN)#cFDB)Ғsp0S'dZ,%`98I9g1#5*HAIVRrrII˽v[fZ2&'-(;̤,37)js1ytn`@'(*Ŝ0w;^QTc(!AQ\zQu⻘g`ދ`(Y'Q&`Aǂ>7h^9X۰/cQZ.Q',iXrqKXKkKϠeQ$~Pve(߉(GXփeOa<,?`EVXq+`e +Pщ?XkbX;)*O-ۅuX*W`/AC6njQ
T@4{~kPmTjZPӅQ|
5PV6ZAU~xGl +b(6}Ӹ||[4PE.ԟB4.4@MSyx +d7[8|A9
*_C @!pͧ|-}hy0bQl;ma +|y3z+у+߃2w,,~I,cK7,sbTgsxVسb"+βҁ[Xi6 +UXuCXI!`6'xZ+ֺv ko#PO`$̺1+'hA۲>\ʆlxleL,&濳ًWbÖil` +9?pK.bK^RH]Hj!iCG.R<]˥\q'Wΐ#}yd##̿U-Wݹj KETJv'"'G\kVJ]ɝIn9\wF'gEy#!
7sc?(\Ma87fnS$:sk2 +c=)؉Ps<wSҏԊ@J([@Y e{q(_Ey]Tb*QTQL|*7PYŃq<8ăTj<UG)<<#Q=x'x2'x -^F]~$>55f:5!ԤQS3O?/yW*u0-
ovv8o
<xw e%~KΝ4} +ʨq,>S'䉸fl4{,J\QG>.cĢX<ar(H+%oic&mmki{TMv5bW։UhƋ&GY/*0[:/ytrNyb*yW.(DKtwk/6b)b{IlŮ
;w*ݮ}{vZNڋP-QQ#q8qrLqT-=HXFzႱ4mhnsR+!tiRMT귙mbe!)F25&zsK[1]ouYiTWz*㵻>^]>*iQNxgci +6U$ź!pS*M:D4pj[\LP2w4l)ڽV2٘B1ĆeT7ruFɣow[C箲oMVۭ_~*ҳݳUj(hk_G\**=Ir⏘gs}WF45#~wdQ3K?[djha8'6}h*͛8%ʌTEJLjt27*@XX+W\zjFo긱`di<Mcֵ.hjԈ>^ǎ}o-;|N3\'ѪE宮2~otjrvlt:499}MΟd*mpZϝNiu|]_fyf{_8\ +cEWJuddXA,R
^uZT<1`'1BwmLAЎfMLh-`R1SP'6 !P +A`8:Iyo;5WcMsb8H?C (O2 '1Xe($Q#m*Z&D%Ÿ$?Y$W@\ +^ [wQ? DVkE cHikE `qo/8H"`5Z:>t/`
l)(x֔:2;g ~乑K:pCB.\?$+ /D:s;LdVާ_yElWnrIwV2aQrV>aE诣l|MG3KdѸWrhmqc]D@ +5맖o@J
ⱐ[`юR1M"ebTk +"2rsܜ,JT +)Jf;<36v`|MRLyg%Lha@Բv]6PVXz܊:`67vs۶ͤf_P(عIѽFQgqD<M"wٲ@S%~s˄<ˠpA7L4 +').O $1gaS +FA *j`jHs85r65_ûix0+æe<J.۔I33P3V=p|)Uvٕ7ڥ.?Ndf\*Ty@ȰLQo",ȱb>I؟k +,x´Y+xޅ%?Y7W?'fSQ;OhmX>hap4q +T3{' +bq)"|("$C;{Cc~!"<Ϟbp|;\hp'nMh!ofq?=#ȩnjb]M:ANdS@cK/'.]ؕҊr+n3BS'QڊFL_)kո3|㺲[51%l`o5yd8;E%_$C].gE.ӻEo{×/Hu1V*tcM\(uLv`^ʺ'd.aCc8φ%oNOc%Owre 7sT':
Z6=(iRejVjqIvЍZS
#qEׅثNf$+ :b!0
0z74d _n<78 +:|'4ꆃn-g2@~7F`n*4U&Ssb4]IUeIîvh EY"*4
68idQ&Ȫ"F (7;hH# +q9㭞מ3s2U{wؐc9} @,O<ȧ +y@,A霥>x0@o>0߹BQꄴHZF߁Wwx@ب h]}rġ?^`YDy +8QhxMB^ +iPM$H4řl?E5s0Fξc\MG$#d 0X( _{]W{z)JGlc/9lIW8_o +[p s%{=S~!3#XsoXA^brDT;\0|uijCl"SKOaFpfٽƝX]WQ/qYU̳ +\_dϬJ=gˮe:˖~k:C}~v;F?j-Zףlc7/64!o]6=iM:qu=,WA;-wnpt?x<lw\t;m+)
)3^$ՊXA~\Q9"f `
fOLV"dam+|V"*54;IG@R0IDGtw杖k8}оqK. !s#/|kVIU>z=< +֕7R,|#zJ +7䞸b~I:2-n8v&IX6}]B/狅e / r!r +W[q:eeT#8JI؊ ~#V{DWR,NGNJ?8$1aK~#}P@Wck"o- MRU{ +j9 55ZgӶ0&22aq5W5 :PMHd\& +i O~ +߭ +O[;W7 @),1oѻH <|Lqt +ͲE.yl3wknVj'.7^C"'S8!=)-37},uJ-'wjT
C8̂bX Vdh!kd=fv.,8ϪZP㴬>p-1igtButW=!<pfvgD}%ũ)l^'HXirQ(,;إ= +ᕄZI=Zd7t\fQ;+.3m#[0͝uW';A(J=x7:S~UTܺ{3N~^p@B6;)#Q%x/"5 ,?6_zvC
xեoUl*&&!\MNX§(c_TW{PSWo6t:Y{Am}퀏 +uOB +"H 1H@%+H<ް, +Vj"[Cw93;;;q +ۃEMݭ=+{Z>t(JK,hk<BCDtNg>>yF5:7mx\ >`8>ؼ#Wk?,oۏ?|+3cʷD3? xO^W +(pỏhm;4kB4'!¼.mv}rWdd\鲫1oƔo b| +K+|#n7X"M-S)Ҡ_ÐG/ +3+ +pOa &RU^'W\ˇ008ZgO{":b(IDr +38@Gp|dfA,nKB4 +\-L#'(wsByv曙 +;&_puCvϙ\*"G8%c[Єtj2I&y&`r9kX#
v
!>d7,Y)-.ʝ`BuA7ԅ $T]LOq#\=ÚfMg]v?`:sy|U%7UHϔ$<Բa$ySL͇^!v|[0;xx*53LEU-
%'KH=wSrm
K-G^~6#̅*Ef
hD[sq>d{Z4xXjq9[ +
C@Hnz~⛽Ƽ +!jy&3;$
-pp+kjD#CXA.Cz$ȭP+ +y +kf=w/)ڛSyƺJ-hoh1WϏ7'
x_vY?)V"XP%DBҫߦ8X/RMҢsyIZeӲeRefYe67"1R6yǶ=$5&e;?jQ4Q}`E&ミ̖%DSgP'u=Վ`UC;K%"ᙺ;IJ1 +,:F=dal
SyNM@>Ť\whMS2#X8(zy̅RG+6D.8lpLA2}-1g;M.
h)hͷd5qb/\i%knOTaH]{*Jxf7Nks"rG<c@$xïIݤ,''{g[K
Dm~V j
ڝ~ +Mg'zQz) &MKRT+ڵ y^:V48 el>=0[<FI]1ro,- +l<=cg0A.~jTi^]=NC +RS^Wnx8m$+^uI58Qd\ <-EN<4n1x=6؏Z+-;(rٟc9~Ud@p cb]QMY<i{nAh.zj[i(HSZyPAkw "j־YO;Ós2};ݹw2oNUR}Jj$_jn:xIJ{:%$褢OAE`4#8ɕ> Q/e*<NU=wgAt{p7c5eء.8y%#ލ2G8|W'*_}ۆhcES,IPxp+['WTaJ":\HCVd=*2A9O=3Fxy#^7_ @H4_$ 'c"x?uX +DZ`0|-)ryNdWLbuڏJK(EN-pt@sHbzX9b+)gܛ\+,Tvg6xć;}]6HTV/}o.26qxj7O)xL + pLA>M2 |`UO=D P + /B4G1<OX_֤ZEE%UHơ^>ylweR)<嗡`P;khK6]ł?==ݞnn;\XצR%*~!! 賍jEEت\qnŢYTh=T¯Ewje13Aid6/#7Jpk̾/e[835f35朶$|xӉ/BFBY٫qqc!0vjh]` +t]l0e +FsYd6t=:# +Wq}ۇ{nRN"43bFfD9ӌzPlXuW0g7<y^Jʉ<e91n8pZ%ßĝ)Y&S%N_
w҆WWkϚ{o HIEflKQ*ow߱^v]J~"6WlSP\\J8'_rAFDȖB40p;cS `6F["#7-[F&=b}35Q\?}6=+79i26uaBI[9zgG5N&g'ceS:>]ZNΥ@LPuv~E(nڹŖ1V*}$&Г'c#*7HKU谈½3_~Owt?ã-08<`[RYZ~]E?oos(^fSkس<]YyAThhldV
?XN{:46LW{TtJE=uي6vX.//`@N^Dsqq_?O'ɎK%U9
DqL*ggLlom$]-|!Y[ +oӅ7G\'F!(NPF"4 3nDT]($4B9{$} z{q:tcdz 屐"_0~"*,@7Ӈbp4bh*L$e'˙S^ FdFFyJ['>:&Y#qT|('"i_*+z#<<c'v`yY' &D%E_ X/s@Z3
'^W?PzA=Jws߽Wz客\#v93HĢo_ra!etj*1.Ec +bI\>Yh 2(.(`r#MU%0pHcayEd˓pJo
+ph +hw%v9"[}4P{sZ<^zXZb{P):.8tJeϺzDO-`)FU+|W) +W +Faj*?_H%$( +y.$= Uъw4(<E +>|L@V&Obq060~[<"hdolKcMe_W"=z4bwz?RmZXy{h5/>GR +xdeaq.{\
r̋C&T =${P)Cq37Sxh&zACwoЏ:-CZ7";4m![&0 W|~AB +$) +\5SM;)Z?UQȀ{2ֽB[G +>g9ӐQV^F^VLR&*D&:>3< +(\V(Ԇs0l g_LN-^߆6>-`"(ON!y$qQsvC:&{I2%7#+MIL
a)'.?!WC,<f?;X%"sENMOwk;gK\G[+GJ}8}bw(7`n +wvͲ~Y)Una~sI̭cEprb;j..oQg"D+Jiw;tIm-}ۼ#*:T;0!`1ZP/)<CL=nuTE
]Qa2G+_zq:Jgdgε +A]}_͍z!L6"K
ON[G9_tVԹ\NN(76t8dLj HLJ
4u{9Ttdd `%l/l_<2ӏ#7ٴȝ'SA--j'R +p~&=N:joma/qE=EhWRމEGAB훆[! +^җKC7%>jp-p(s.>x{ouD4SVc + jlDx{#ė}Ty'yʜn<zvHL:F]z#T608RQ-)7J:K*kQgJjFgNt~߷} +㑶ojɋ;bX╢k
4e +i(˥ocV:q^)x5`#NpΨ*zٹGK5xE[Aޱ;rwN NCKY28p! 1L!8a 5!FF``7Ff/KYNFh꿂aQI|D%/%[G6%XT13`dr@&7[K;\&~7 +{SL[<AasGe(8bD+~KT# MЗRqtL:=h5U&0y:=6{テ~lzH{>ۋg÷/Ctp<U|#e?bHAkXدŅ*'ELINqy +4m ?d*ȔFBUx*j98;FLg)JM)UH W*pkdsE0۠me;rr^!Js2 <
dnbdΔ89SyYm4~>cȨ
[#E<<e^Yg[A/(Ec9c;LWCx+ljz+=Bk<LtL +uT*(d#%҃4,7:c.ғ^ W/@;RK#qm#FWNl{Xay|y>'='3ik|}uv¹ںؔ42!CklPcCv[4/cӉ=(ك~9"gIJ8˫ÔWm"ū{NazRfȒb,_+hQY1Ӯ
"WΧ]&đbMcaTŖCfA!I +/>stiƹ̣q% fJD +nCB6vg=MndاĀX&kQ;G^I9rQ|l%{aGaC`DV:eh!Vuyޣ6rFa9a'kMVҶjgɣt*(}j*v4t}\KkZY+v$a*v7BkJ L +٫TmU*
j*EC*Mb27.m#؊hقphGDe7- " +ȾE@iȈaiE1<bZa.|wsjŲP
5SIڪ&mk$_Tim~1ϡJ,cn|szOdW%zߓMzCi ҅.Gh/a`VDj:ca>͔BJ|8e$!ħFW,aBSϞI
CTwQ,n04Jl:ɲgV"@5|mƦ7l:.qE6wVSy3 +Z!\][lG;0~5D $% +fh2gHx:&h<%EA}ᗇ6*YIJM7,/z,t~s[{aLZwf5q˱>gr%kJr{r%}մWAgż]$5 +9\ {tYƲ#
MHI1N><B
Gua#1o[r>MR%^jc3ұ|4ȋiMl0E98WV+:%67`YA kqKՔmexTbՋ#Ѽx"QQ,ťIdҡe0vUc|҄j>-i^""iJ5P|7~ؿ;9-K~0X +Ga1sQ]%soN
dfbZy[V"v/VkƃUS{P<`>GfR$R;ݦdhw[8_UɗIۥDf +?[7.f/>Dg$ + +w+n2w?fC)*MQV(8{Q"3ŽjU7fʣߚLIZdo)!tf":"T +V&*i܄BDv]9jWScc[xT_1I7h.#B$5rLME:#=%A~~tj/h%{_?5ThyyDG0T߽KO+F\ }F0&a8!
37h +&v-pߩwPƬyHJ9/!>8m~i %hD_ˠU}G{~Qu9&KsVLebAn,k7b}F\cM`TV@+j}Z]K*,tZpHTk]iDLPH/jBV|TIӀb eHY~8c4LFYlp+1:_a旒d5cky^bo<q<rS«4*+CHUD0T.2L4, + ϥѱEI'Sb8j<M DPbDf`F<'!(VGjc~c^0;Zpx +"9x7\BcBY殢yK^gd#b3DUҴ~~Usϩ"#j<8 + ix,ߚ[];ǠO6#Bp ջ˾G]<.4`? g/tONU'Ծ1à?6CTG*ӦvHCN1OGp_uk8/>SUwɕ4]V#"ѻjӦvàHgujzgu3hy
iKbl!蝖]i@֗F=Ym{
6x.<~j`~,{HLp="g 3+c0m33wX+Zz6qa܃(Süb`k,n3ɽ.u.@Ȉ6t̻,P9tBU1.XrjihR<}qqal!/oc?-ݸ@,)3)#=a>f<e +(U +h@~ +?0q]&oa^;_+݁mZԖ| u$R~2}Xa=Cr/{oA{SGxn/.s^B?۫)j^7w_@z:6L +BwEɛļ%y}/͵l +)8D$p @ue-7I9x2Im`1G֜%=ị]4Mv#[ x5,>,BKG[Ƨ&?dM \psVWX1|&>e1(Ѯ~n\KZP11'm^2Ml˕VqD-) F#>v$r?BYY8?2-+M#&;r0CcBMOA>]Ǭ$e )hn:IzMX>,#1:
ìF6 +3cFx0փޫ)PHV#àeº'JHXU'qSlS`xf<t)cn,1p;@lcH$^bE9A)G"lĚh~4;1@* E?DYU3mq!AIK3 +P/(B8Be3aZMƩ`'):.=.wq;`#kr
"aNT]"J]݃-ZLMH${PSWp$Z:rwŶlgv}QPA@ +k(O1`F^ԲʶElkgC=77DQG&ssOrr>F%^/kԆMjڰqeA)x +Kq<Nf]B0̒șB&q騫?Q_7vӶ]>v2Yv|$LTЁcGNEÛ<L` +y`R6*X*N,Q;U*n/U-j + +Iu|?JRUrRE[Z8G;"S`INXR3!cNNu.)SD|hFłT2VΨZb^16V9$Ui-G`[_ZVj(,bUHHΪ|U)vVYYujQsZ,P di;33Vh&mZz95x#!*ikm5&Ծs?g88 +-&cQS!sj11RX`̆^h֘q0RV71Lm6<L98IaKMܑiq
;إQZ-.!%|2V귗b)UPJ(C~B
,9C `M[zKPV3SA1Lţ0T`)MH1LjԶVQ%jxo{XSא %8'i(Oȓ)r#Ou'0O`ZE{<I榬]6 ++,xѨq^Td(NHGHE0i$s6p6_<N\-g@ֵb)pi4&&(v &3?()`"i1pMYfiQ4tpć}bEW@qjx ++0dSSe SX+zL+0f<,(>aZ#aMG?;fYwf8%,('f<`Y<YocGB\
\ax,PATPRbYbRl5G-yUb+V4EUy<SPYcHMy4/_Ix 'W{tB$=꓄H!!(zFiP,J2ϛVGIxbc:z}ix4b"(D@ȕh$dșhJ=%I M]+IXI6ع +=Y-ZkP'뀉ͮ_tp`F7q==hO]jtV;Ц3FU)R4 d +Xv{I/1dp" +d"0la[|!@C%6$g}?鞶Z',-px*p^P
Yjօ;+V?0T{6T㷮SYߺ!noĉ;[-( "؇Z'Jۘ)͎1QMMt[oYϞS]P"3ejj=I8mVUjcϮmGuyq+20[9GT`0f9+VW(AiԜ ~FOe^l^,"-+_ŃKS[ϼ(}!πߧ➌r*^NW=ZRR蓩td}J&_*.O<u<"./Q5h/S/.,¿"H33A_ +5+1 *8 YWc3_R*EfVRzahNE 1 +D9<E$#H.ᨉ p-V>$dЄH8Er)ʐY" 6V}7ҙ^WB$dj]Z隨XIeLAtYV5!؝ƆٞF#!mm:TȵG)IED05*}sIou>[ztq#?ګ4(+XcC/yE\&3j4FpP 8T\ @d]ATn#MPtd@QyUsTƱj]}}9'mT jЦQpX."bl*h , |.]Po͍j-|v/uzU;`,]f
_0z>k{յ7np+kLFzB:Z]V!iiWtz}] gcr#2v+:h +M<Iޠ3;lPfQ>щq߹PLѢ]^*^yͅrpg<OEFq^ۉԠ4 !7KM"al]b`ceILLlHH4'2NRktrVyJhdw5>תb%fGqiwW
>i+Li +>|742O"e+~T#B{7$'en8A~)hj!v{7h%EV*]|Ą7O+1GB8N JDx>S!v䄅PTe-M:<I5I#4$V$IݛbhOD +e4r@ᷮHFH)^ׇ!^AG841kgg5FaÎQ``<d ̐fۢ36OH׀Kqj}#'&DYBQQ9ǐ2dlJPll?WBBC."=(L1vT?UU
וftSA].⨲l.`ٮRF6>*R$e]=AuvDz0K9k։耼21l>C9Zʙ/9!2 1ēU*8$q1q +V7'ؗimm6%#e&tidM=~]Ȟ!RB'7b{"&844zccu;2B|>mQhW4sH@ד[fZ4ޚˑ?(u/CklRJilVEGj3 +d )g9qI+,`8.+W8i4ڒAj>]&\xE>|HłPK!V*HoT9LmΠ5˞Ar[tyjR!G县&$V)+hj`arO /I#}"4$ "T;:]d [
nr>Fѷ&0d4/gf?N_'R[Z!5l(Ϝ{`HNˏ*ghh!ж:(g(DU$qEࠢc + (&ޛ D7 e)o$YzTW)Z~ N`Trk,jkkw߈~fN!qsEeeY\"B9iWbu9YsiſuL FXqB>F{H^W.
qXs{!G*gQrA,ZrWd;3÷ΕpGe1mQn#{Bߔ<0\n/ uTry
]; +:M7Eut\q6O"3IW[i04Z'cѭb[*
籌ǞWSKU"zڨp[pѬHYbQNMKa*R[B9+p;ᐱ.n^H +SAAZ ^$TJP!?u_w=NqQJ-SOwD$p +{*#!ؔ[@}EܠznwacE|q?ܯ0'$עoҨ|. +.Q SO`cbkk,tRcRbJl(F@ȶ_ZX#f'j}BU=~B㡦k~mA_ (*s
{?+-.7Q]>f +aK<{agx0f'<XB[ilՐOx4H6w`LX;R&0UNOh|0{t*6*i03ǔ1B~ws03ʭ9kiEC:O:P.93V;$x)J~VyB? +9Il,RztRPKT|(
}PU/aЅv/\<vfXViXr@ȷv}-iU2'';P +a١UcKӄ[{OT],H,Rn$K<${F<}V5Ü7JU~ +i;ѤpÀ0p&;Pt&QF.grI\Ɛ/}On"_&';Qᙟ,<MLWvrP7pz/('mZ ޢc/V*W8R:l,[au;Z! ռPPtg8Ca^>c%/^Edn'BsBeF#ӥ>zfXy zD&7covb_p@|]EV X]:!BDPFaXht")T +N0I%F=NxDFǼ=$뚼Hio^Wˍֿ(>?$U$R˸".]IJYj±cx(]֣IITrGEe9I{ذT(O_ګ4(+J&8<iP$m* +Zj2 ( + +4݀
4fX]dPd]@h!fk2SsVcj,gWwι;S슔t:qLQVܥ UToH5Da\3z +aN>4Aaz;MB%ґH*?ƶG+Ϸ}|S^[Ewaø ;Q:vA3?XtH_cO}B%_ts_W(;D?oXB4
-FMaQIebFWȘh!ɣa4kr6'֒T%/hmd}XMfD'dˏ0/Q ;'O){zgj`YYyR!S_浪5&4T?cSd#[浳grp)i +QY_hzEctpdhD(GykOO\^`ȣdrVA(xS,ח!0nH~HI= +h y56F]<+;|yJПi<q3'v]
'B|DNgawa +r@x0+&U4ԗc2wɗiY8d +&?#*n<PMGr:`K.7a!82H]| ; +KWH2bKћIdhv9OYkpܙ\]Vfv>E"b}T@AdmflkyL?Z
+1v`;& Dr߫$?|Q)eBG+8``8H
Q;zCϿ2!\KŔU[GDSSrW]g{UwROӔh4P6QFW#bu6|8oByS"Wi5є:}
9tnt^sfj7GUw648.~IKXGogh+CXoR\MpT\˳^ţ5TҸ=Ly}
`NRcI䝪KN~B ++PRϤPV3fY]a>G8(룻`[$k`Ψ_Mw!UYVWU4c4 +dϋ.a +a1D! Ihގc;/2rIu09C4,{i=Op5[FFn"z,z?rUi蔤*80/Hg#[cu`8SMDhK'Պy^\kÐoAMe͕fxK|ryqDCOe#j +awC f7:$.pBsހDl>!hG$ ыќ$v<ބ`DY宫9m$fB\\-a?^//m+;YH46VDJF]5ӊs偙\3Mu
VKs0KDwǖxOxUkAM5{%lb|"}EaχTa}mkn0F/Y#,` +n7I0Is$yHBNT+c|cXv:M,ZZTrQ=+=S{5ufqp/g{٘k:>ve+n[BҭA "/*/MWE@A +]Vc잛pfDDpqG==;ww%
lQ^..qr\a~悼PG++S&G܃qF;
u۵x@dʄŞPlxW(+BT)ijQ;q (@~:[7)n N}9(0/zWzf\F~z|I_4uERq&>.tAZ{yx4# e`hFVB.2<DD(H&Kh5ZPZ@:X_ĚIbƱKēz$qytczϖaF.|Gc<6AUFͤZy%·d w5Dgx&_
_=qVǟlqOqŴ? њ^-l6Z\a6=@aϦ%I:7s{|'/:eArͲ&,.l쪛*u"1V74f[37cVŋjՠ[tɚ6N{bh?e,[_z"'W%yzzOƨ Ŋ:nnq/<ck4sa נ72~D5db`T01B^P٪k>aDuIwRGHXv-^%5M-!_Oڣvv)#sEsqz;)tw:F_bctINAQ2_ȕ2L,rp'n<ǰ5 |_12'u妚7N5I1XmL\Hw<Xw^W_Z +4"}Dh*w]U5v&1;HYlB,cSsd$!6`O'""ig&iK4Ɩi(EPpga腭-uE#6qcP+w8 ӏ
\hPͥiJqRoOvtIv~q +ˉR0KLtQ0WeB^Y$`9v
(dpn`a.ǿ,RgAL?XQvS2c 7>?=[AjCÂ4+}jG2r̳<R"Sfg(z&;T=kš?]\yEZ9.͖+|%&~k}#<EntyXGf*M^VtT^yw<Fń TӠ\sM&قdI`rʺ=G]fB^$Bv$ +ydG +82[ZD~d-H᭫ҕoCU3<6я;PdU%جN!-aIf $Q#,a1ƬQ\̝hʒ[`!gɮe4>(5L{d.0 +NW'T pOV +t*,y?j97G`&а vb6/61Ƀ4_tk a~ +%4کfhgɓ<
ڌCs 52X>h@H$ACdpŖqۿ<#<*7HXJLK6MoNXo֫=tdge'k2RMH"]MJfL.!vm+
1%!*J2 nvFcηyη3s8ggZ.St08R#^"oE
V[G; uT/~u7q+^d +˘ܕaz)O(_0C9II^&-Cݏ&÷ cb ^M&)9iMh=<M{mE0CZaCV}
re+㧏4:pAmrW0|:üS#&8!tF0Y;j>*p5V5$+05É&x
yH~r×mUEL%G,%NqlQzΉ7M]Wmܚ +c +8j;zaJ6@jBA/=H،NhT[HW5Xj +3$̐q^yfs0יJzsKra&]CpXG0jZ?]}=Ba-Lm=eoNWA@+J"G2uC ƙa- +CJI!
:GCچX4Iz2T'(a:^xW`hpFa#$?O$7ldH8"0fvB<M8atiB
G#ڋxWb0 e0UA/ka_僄j[nLa{|{0 +^Ҙj0YJ5[ߐn)# +S8߆Z7[zJ5̼,ZSzy[PР,>웋yKf#U!똵_!VNi.!L<LtET4w2ԛ+]zXur,9^Nfe$g>&R[g0}FۼՆnb5%ߧd{`,fg'9!LjU߈ +b@`r*k$'eOkڬ
L7LsZfK.$T)\fq4
z(jZglfmmB_ +R`7S5JM΅]IMdM=\Af1r
B"ڰヅd+}\uhҨ$L8mU0nW\]EEWE
(
""DdQ#ƠM5zKΙ]3'vWn}_]u4JnnY7DjLh0"DT2mI^p,x17xi1Fqv6DRSSuYHEyk^8<QVhQIIWE_gm:!K͔ޢ?&$KִzobDv
/Q5:a1a{3^a+Ŷ4K| Ah<?}s*A
}Y]vV|,D|9ЇvR!!Xw$#6#.΄d1b,=g31DxَҰQC +AvU]`hǣO֞ +
MKjʊwDd1? I=Nb4zb_|9h4l=(=Ra~tjLJ㙺> yk[WA0ኇ|8FRc,Дxw0N҇ԋR㙈0rƲ??}!)47:j^c'6#k8wn@zڸ}H<wfOhvmans(?6=1E6SjØeY.Ͻ*9'BJda̍¸#b5GYjlL
.mu`x`/-C$IBe + 0AUrlj 桩r0I8D75$R&-0<議 +k"Ck;&#y4 +I4VGHLpwBjɈt,|XʊHDߺ_UEmLkģCs'jrd)bSQ}X|6bUq)9V^X4kȚ6ҝ5ePduYS +k݉4T]<OƎU;0o]0~-vb/N;U5L9!cAqa䗃}_O~ȪG:/9H) !sG|Kw-pd;+
=}AEw%A~X +WU ǚ;(_578`m*:?۲8 + +R9ήj.zݗ\vGUlD. MTrv];Hʯ8#vF̕^;MUm}) HJ>-xǩ"Tr׀w՚B(d2Ki֠ld
iʼ;y.l-[䧤{WHARYVF#Vx`$eD +! +Fj@j>sB!pBy
{axn +ݺ]F9burfI5=L} +#<;P|/GބukQ1:*EQvX%2!`hQŅae?8Ev8T +ꌶ7̏/*SxΜ9+y{? +GBR2|Q$PN8SC6MJUJH`C+ +v{;MY[+-6NT3XJU0Q[Zwlagw#YkWՏ7VDP9]u/-f}hcka2c"*er7N8%d4|H<爮zWEUFi +LJAP(~4Q_fUn@<(JFYHY*2ryno_Zǟ`81nBӓZбTeWg2١}GZ8j/v~L81wZ.րCUe[1.9Ȧјg;2硉gA"#B尘k "7w5`6Fy"*戹{ixEC9jbSqYtCrGa<YX~<J|ϵO,꧇J%2[ɀXy>#*//ԝO`(Ln3;ڀ%y6>%Dw$'_:ᒾsn$"t$N |? +QDDz;\ JwZʵRLMV'#qehC%n|,&ơ(C'@ᐺL0`t#
׀ ++b +Y"W_aQ3(~7 +amõ[)}k@S^UYSX]
g7+ +ܾw].{TtYP
h?fd'7!5;6\݊YGc>?%kVO23Uﭒǩ:ӭm~#5l# +d.nh'@HyĖLB_eߩ OXf#ZRάHb&g0nC&QQOmA;ߑYe5{<6CMCДKQN<&]-K*I"ȳu^ +DC3o|_@ryccNlZzSe=})I'h*ӟo!9H-hbse2/yh}3HaFS/Ӡc?h `hNb~:'kx^ҨBYonyoZfPoXZ%{2g%D\0gߜ7H,dD<_:Bĵ`jp,^$~3 +Zb6Dza#}8P^}v5x\Td:\Ozb\AfboɦiVއouWӫWE}MAZ+Q"{yXo7mE#<a.f9p<090/ᣥB;[ǰcskF[qd:!ð^a6IUK5?ӫ
5j*nω/fā{bnfOeZ)#Ω}eO Ʃ1T,w`)Xߪ25Tq&nP:?? ++\Tr)`@V4*]}ѱ_jwѿ2g&}b =5xy.4M)y.yk4`6Wd&2,5zaӤ\ +f.m)ڨa">|W?̯
x*I1{> +cx
4~h?{7it7 _[Ghvc~1Y%GK8*;. r;dA=M7VcD l8XP}J5-\q38q3==>~?[uOzʒSԓ'beZE 4cǼᓇ`'&>T72,4ŨbJQ<?D!.q`cf"Ve9zݦ.d(|˶]s +d^B8q+C$A<&zyohI.ي|4)s*g33$se~7s<lE00[,P}>XmmV`R`b~xQّʓ}'^]pCmDE^愈 :d<'LiJb k$ ?WM-snnS]N)#%~z%U
925Zu<V,Ʃil/k^8T.ȟ.89T+* Ȥ#[9Ovf&T`H|C+n1&*e}7lm?2/=8:q~M>B9Zhl~}5e((<_zSJZ~Sl2e÷
^j܇g+NUk7uh<hu5z~:'|Ȝl9} +=W +%Bd o>q࢜M|C?8̱ӊ+7UwI5&- +ˎǃFbEhXrrEY(IIQSv::_=~4N:iKX7 Chvt`C=QkfwIMG3fӿEj!д9˂ѦzBڔ)oeQ= +!%в~XK̠نp JIp_v">ɉkt?hu6\U/oX[TSتRSWFqFn0#9jI]v^xێjuMNBed +0-_%?Kf@ŨmPwarI76nSoetT%
-4o>^uiAD%Q[ؚ\\>#C!:5G1
r$J֕JHj) L.ن50R*ːgoՖ8Ik.!vՆ\12,GXevQ + f.c(]GL@v_TjU+&Hg>%(Q%"5(LZEfEF9; cl?lĀm7XMЎI#2䀬_[a&z3akD9o._XN+>Yۋ74/b;hxO&B0i2r +(ªm]Zm}TRB $ +(!(<*7@|Tef~t߽nk3;o>GLIU j`udRpxIpi1n?ΦoOyw寳W~Oopu.WJD^#Q`
+z`C:xEg(ccB1->TqޗVK0lZu2-CpK+ݓw.̛Gy`ex9c;hfnˍ@֝i)8qs/(&lk\ +LW3"l M=7TژƀގěZNu;fZD>jEjē#<L`ѯ!@"CvB.vy~톹Nݷf?e%٪
zg&=مLI-v=aa7)-hNTSes|v]ZWhS@t^9|*=R#,)m6V$6an
ڍ!L{DW/ܲH;Sa{3S((8KU!TL]Omc'l[T?}}htoT[V۫ +CQ \0-I-j8jzm| +IUaq6{`&|e}}e#'7`$egs5;%+TFa!Gky
"Ô_ptMY\N8ξ9F?Lxvzx^ZyibCp$2G[YHqư
'a1#`Sĸ5<}9 omr!NŖ ĝjjSxԦIJɌR|fr!Y$dWә*,6ՐV{?YC3X,<EdՖd,&B[aj +*+<7|g$HONȢ3xFl1iE<k<M1"ʉ +j.GWs:; A-!IOkҥ_P4I_FT^ +!"Ww`g8e&{Jz7 +spY{;PUOzKH')Խ![xRİ-$g1)kj#b+
ƲIrc}R023<V^RH7""B谽!RL"-VPI4p0{CcF긺_n~dl&5˷gɝrqT&Pmv؈R0<{8 gA}.p杻/b +*O%X.:3XO3LdMyc}18*nZvY*5PxA#K4Yݠ +oJZ^Qû{ߏo^Z]>}1ZwsV0í밿g.e(.Aѫ/sRI}F\0~淝BSMZsU.;U0 +=dcX[ &>=>r$"<S^2YtUvo I$yTkb`Bwru?LX'˅e +}/zVU$hh' a2³iUv饃$ +~⇆ +(eWp\;e7@z4AAhb5Ϟ?쌶q{JJq&Ch\G06>H;;۫gFlk3+}9{`95S6r4nt(7u)P0f.}U>kϚc] &^Sm<7n\WD[^#]a2Z;O0n|)(wV0pϛUm` +?g +|ǎ]By@welCrf< 9%:͌ΈV@9Sy6b=%^HJKbcshmn +-kjzPNBΖB=!bZ{-to%gEԑs"~v3#PͣG9EC1dz`Ko%&-bȀ1LTIB#ڃ0dF-vE8XFN66 +U.8`x tX6@] Vq85w]8L'{wN#f$d6Ty^AVBȰÞ1'^l8 +_wNnAթSuU+f-IIΊȣ1GKtiFF8@KI(STq+F\M2![&xl:.;N{fn9gfnf!z+b{?mwϥމ!Ľf +UVr&:^f 0kn^n067q +<EbIUwѺ_akf7ƴ~imDk)4=EVr&W4Iò@_NH!0yKмjKР +v 7^2J7ܔ:TJo65^gs2XzhdaYaz-ѐ* rhe[-bEMI\qܖE0|+? 1@0 0eK`:-hnQ2&,"YE*êN+pRsp;LUH!ƎdR4OX+UpLX)Zugk +WJo&D-\ed? +fzWVX9lYGt:!ce)Jjj]Jqת4G~aŮ!%Horb^4PIA_hU+"F!{ISH^>R +N֭wk+UDQ|<TDD+!(mO+c!hTȣP0_CX>8M:?{(2`*80Gl +lx7.8z9UH|b(n+q{X=(Z=54mxˮ
|28U5^Gn//EnԱ2JV--; ,z8_'hmnl؉@_jO+Ot!<"|`~bJWhp B^ +EQnj}0!-0~Jv8{I_^[*=%+ح.*
eX|e\?3;L+A&1IR +QuuG/,|-b0#sFcl+CNItߴFV +lnմ7hyo1@,8V!,-dOg$[b
-rLimtMP
V*_SF?2#,we|$;>;8Lv/g&%G1Ў-Eh 0&0pJEEij,َBS@_wzME:GH1'm\ݑ8Y<F_,T9$LLKԺ{۫γ"̈́dS_]rOMgHi187k묃1oV`3Rw/_к-fƛh^G +J2[YU`1=42N'Lٿ,&#c-;"}?oy~nޯV93.829{!+ERyruWF +c
Ι§y90 :YEQ!8"Gۺ:#yqa!dيwTKxx@wlC9_^vM'ܹe zM]S|_ErP,.ZfX/32]zrhRh>!҆5#`^ȏ}'1AM?GCR?Pk'#@&aYM%& EMX-?xc!6>%Ec~Dq,p"QAixx+VT*q$
6#3mGYr +endstream +endobj +144 0 obj +<< +/Length 36 +/BBox [0.0 0.0 103.007 49.3506] +/Filter /FlateDecode +/Resources << +/XObject << +/n0 193 0 R +/n2 194 0 R +>> +>> +/Subtype /Form +/Type /XObject +>> +stream
+H*T0T0 +
+endstream +endobj +145 0 obj +<< +/BaseFont /BCDEEE+Calibri-Bold +/CIDSystemInfo 195 0 R +/CIDToGIDMap /Identity +/DW 1000 +/FontDescriptor 196 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 [507] + 3 [226 606] + 14 [606] + 18 [529] + 28 [488] +38 [459 637] + 47 [267] + 58 [331] + 60 [547] + 62 [423] +68 [874 659] + 75 [676] + 87 [532] + 90 [563] + 94 [473] +100 [495] + 104 [653] + 116 [906] + 122 [520] + 127 [478] +258 [494] + 268 [494] + 271 [537 418] + 282 [537] + 286 [503] +295 [503] + 336 [474] + 349 [246] + 361 [255] + 364 [480] +367 [246] + 371 [264] + 373 [813 537 537] + 381 [538] + 393 [537] +395 [537 355] + 400 [399] + 410 [347] + 437 [537] + 449 [745] +455 [474] + 460 [397] + 463 [397] + 853 [258] + 855 [276 267] +863 [435] + 867 [435] + 882 [306] + 884 [498] + 913 [498] +1004 [507 507 507 507 507 507 507 507 507] +] +>> +endobj +146 0 obj +<< +/Length 516 +/Filter /FlateDecode +>> +stream
+x}K0^JƎcP$ C]UwC#$2a='G*)X;mw]86m쥻ʊ=5mDsQ70V粏b]{.Z,DO^wO˺;(j$~{kg"\})ي^voۋy_[! b+ۓr'l[OǨ}eR=S:ۄuD $9Z9sU=JjmymtZ6 (f (5ԇ3qm'mT'J8*OKD>AvBIdbiDŽaL`JcOLȩ)\Q͠$ h3|L4'@A.A- +}7p_9@
UYdЯ]RzcrH'{ɄּW@&f؛C|>_Buu7nB BhZ֧QD
+endstream +endobj +147 0 obj +<< +/Ascent 750 +/AvgWidth 536 +/CapHeight 750 +/Descent -250 +/Flags 32 +/FontBBox [-519 -250 1263 750] +/FontFile2 197 0 R +/FontName /BCDFEE+Calibri-Bold +/FontWeight 700 +/ItalicAngle 0 +/MaxWidth 1781 +/StemV 53 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +148 0 obj +<< +/Ascent 750 +/AvgWidth 521 +/CapHeight 750 +/Descent -250 +/Flags 32 +/FontBBox [-503 -250 1240 750] +/FontFile2 198 0 R +/FontName /BCDGEE+Calibri +/FontWeight 400 +/ItalicAngle 0 +/MaxWidth 1743 +/StemV 52 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +149 0 obj +<< +/BaseFont /BCDHEE+Calibri +/CIDSystemInfo 199 0 R +/CIDToGIDMap /Identity +/DW 1000 +/FontDescriptor 200 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 [507] + 3 [226] + 28 [488] + 38 [459 631] + 47 [252] +60 [520] + 62 [420] + 69 [646] + 75 [662] + 87 [517] +90 [543] + 94 [459] + 100 [487] + 104 [642] + 115 [567 890] +127 [468] + 258 [479] + 268 [479] + 271 [525 423 423] + 282 [525] +286 [498] + 295 [498 305] + 336 [471] + 346 [525] + 349 [230] +361 [239] + 364 [455] + 367 [230] + 371 [248] + 373 [799 525 525] +381 [527] + 383 [527] + 393 [525] + 396 [349] + 400 [391 391] +410 [335] + 437 [525] + 448 [452 715] + 455 [453] + 460 [395] +463 [395] + 853 [250 268 268 252] + 863 [418] + 867 [418] + 882 [306] +884 [498] + 894 [303 303 307 307] + 913 [498] + 1004 [507 507 507 507 507 507 507 507 507 507] +] +>> +endobj +150 0 obj +<< +/Length 585 +/Filter /FlateDecode +>> +stream
+xUˮ0^. EH R}iWUD}7P %щg̜avz`ᗾ-v`纩z{kҲM V}עB|{=46XYކ^6U{s_پn.{vtu6Aʞ]EZrpu>,;$adʶ(m_4{Rݓft.=Y+gdX=J
3C?>(G9tD*2BQbh$%VtJ7wZdP!%!-@ BpEB!^G@^?!Dtzx{f3g}`;Q 퀨BEz4Y@l
07H5/(Ƨ>+$j85OIHϋS<dwFŀ' XO1Sd]|9B)3A/EzbL +W(AgT#bG\Z]VtR̆FYvI2"5+c-ٛ3_f*z\R9ǝ9B.b[7n? +endstream +endobj +151 0 obj +<< +/Ascent 905 +/AvgWidth 441 +/CapHeight 728 +/Descent -210 +/Flags 32 +/FontBBox [-665 -210 2000 728] +/FontName /ArialMT +/FontWeight 400 +/ItalicAngle 0 +/Leading 33 +/MaxWidth 2665 +/StemV 44 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +152 0 obj +<< +/BaseFont /BCDIEE+Wingdings-Regular +/CIDSystemInfo 201 0 R +/CIDToGIDMap /Identity +/DW 1000 +/FontDescriptor 202 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 [500] + 131 [458] +] +>> +endobj +153 0 obj +<< +/Length 226 +/Filter /FlateDecode +>> +stream
+x]Mj0>̔B!M{ + gKԑO9VNԩmڻrD%T]qIua;!{uqFJPz1`ΉvEsOalpDc
MJYQHSh^燶-=s{Pve<e%H ok!f*oF
+endstream +endobj +154 0 obj +<< +/Ascent 891 +/AvgWidth 401 +/CapHeight 693 +/Descent -216 +/Flags 32 +/FontBBox [-568 -216 2046 693] +/FontName /TimesNewRomanPSMT +/FontWeight 400 +/ItalicAngle 0 +/Leading 42 +/MaxWidth 2614 +/StemV 40 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +155 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +156 0 obj +<< +/K [106 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +157 0 obj +<< +/K [107 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +158 0 obj +<< +/K [108 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +159 0 obj +<< +/K [109 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +160 0 obj +<< +/K [110 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +161 0 obj +<< +/K [111 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +162 0 obj +<< +/K [112 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +163 0 obj +<< +/K [183 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +164 0 obj +<< +/K [117 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +165 0 obj +<< +/K [118 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +166 0 obj +<< +/K [119 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +167 0 obj +<< +/K [120 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +168 0 obj +<< +/K [121 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +169 0 obj +<< +/K [122 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +170 0 obj +<< +/K [123 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +171 0 obj +<< +/K [124 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +172 0 obj +<< +/K [125 0 R] +/P 67 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +173 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +174 0 obj +<< +/K [126 0 R] +/P 72 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +175 0 obj +<< +/K [187 0 R] +/P 72 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +176 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +177 0 obj +<< +/K [138 0 R] +/P 81 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +178 0 obj +<< +/K [139 0 R] +/P 81 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +179 0 obj +<< +/K [140 0 R] +/P 81 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +180 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +181 0 obj +<< +/K [141 0 R] +/P 89 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +182 0 obj +<< +/K [142 0 R] +/P 89 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +183 0 obj +<< +/K [113 0 R 203 0 R] +/P 163 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +184 0 obj +<< +/K [114 0 R] +/P 203 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +185 0 obj +<< +/K [115 0 R] +/P 203 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +186 0 obj +<< +/K [116 0 R] +/P 203 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +187 0 obj +<< +/K [127 0 R 204 0 R] +/P 175 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +188 0 obj +<< +/K [128 0 R 205 0 R] +/P 206 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +189 0 obj +<< +/K [129 0 R 207 0 R] +/P 208 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +190 0 obj +<< +/K [130 0 R 209 0 R] +/P 210 0 R +/Pg 14 0 R +/S /LBody +/Type /StructElem +>> +endobj +191 0 obj +<< +/K [136 0 R] +/P 209 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +192 0 obj +<< +/K [137 0 R] +/P 209 0 R +/Pg 15 0 R +/S /LI +/Type /StructElem +>> +endobj +193 0 obj +<< +/Length 10 +/BBox [0.0 0.0 100.0 100.0] +/Resources << +>> +/Subtype /Form +/Type /XObject +>> +stream
+% DSBlank +
+endstream +endobj +194 0 obj +<< +/Length 308 +/BBox [1.0 1.0 102.007 48.3506] +/Filter /FlateDecode +/Resources << +/ColorSpace << +/CS0 [/ICCBased 211 0 R] +>> +/Font << +/C0_0 212 0 R +/T1_0 11 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/XObject << +/Im0 213 0 R +>> +>> +/Subtype /Form +/Type /XObject +>> +stream
+HdQ[K0~ϯ8osri>/x *խ뺉_o:.BHr4rڒ͏fkݕmQ6|m4Dz:Cz7@dlؽ5ӂk@,WV2\_*do5^L^rE+<}e~BB3z
m-8[vUWEWW%w78KSm+C8Ifm< +9Ƈ$tNPG\!? +endstream +endobj +195 0 obj +<< +/Ordering (Identity) +/Registry (Adobe) +/Supplement 0 +>> +endobj +196 0 obj +<< +/Ascent 750 +/AvgWidth 536 +/CapHeight 750 +/Descent -250 +/Flags 32 +/FontBBox [-519 -250 1263 750] +/FontFile2 197 0 R +/FontName /BCDEEE+Calibri-Bold +/FontWeight 700 +/ItalicAngle 0 +/MaxWidth 1781 +/StemV 53 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +197 0 obj +<< +/Length 51744 +/Filter /FlateDecode +/Length1 133000 +>> +stream
+x\T>fx000/QPaD@M >KTQ4+er51-nyǽeIYi
Y37`kZ{} +Fg7>-,JGAu_N8K'_{6;
CpJ7Zb0s3\[T~Мf[0l'UbTW*Gߪe +FZ_gg}㩶Sz_k}.*=ro_xT^[Ҩ3YvlSVi^<"mg
Q8Oǹzf_l6(-Ex +c0^("%(wYĖhvagxiz +z `; :W%#ϰh,m)y_H@
":clxG^O)l,L{wo*={Dj=;Ez>X;-9$m4%BuՉZZZ:X[.17BxR)bL_8R7@%cPkPNE-G:RzhmP,}, +;]`3 +M-,z͠a)["=3hb8}S`x \1t(r&,c/&aJƳq1\ Ha~$ H@$ H@g?ge9S|xY93 H@$ H@#H@r&a#H@$ H@$ H@z924*A1֡CjGFZZxއh H@$ H@$ H@$ H@.'$ >$%cx?:5d$
@0ƀ΅0fB3,`d +rX)+cwr%&vzsdn2/6Lo,_a,_
ll}/~?lly>\-&xozӠQRx}_ ~yPV}uɯUiNӫ?5#lxԳKsyBV)]JVH;hCFJ^0
f +,gezLly]ĖkulgKl3BV"6BRJ*)H +ԒFJ:P؉S_$;9}s.~-~#jopZ+ +ʍ<cXƝr$|c1hlȦIds6.H10xܖ幤nVK} +Y-X[ԺՖnKJnW`QϤzS\`dEޤu%7%V:ij_:qG0>px]U:ܶe;[rR#
.\f+uS:y;Pi)e6Vޑ%̒+ߛx+SƱA,Fbgu$Ghz3F[tdGd.+>-1USm ~oIE/9`zGdJ_
ckpYLu,ƓZnIn]<-AKV.ֶy,I&},7&wƆS
}NdsKK + ]`! P!xN̆;PD;LC]z +Ro%ńË́RPB(&)G";EQ<p'^TQńZ4jh9Q*pB%aPN(#$hfB"DH 8B,!Mr܁@qԟqBcGQU[QOP?Ec\P_A}A} EP>چW PW_/#\B1EIaANFh$L%4 S u\8PKl꾄,B&!NH#X 6)AA"A 0#q/ҋډ-Կ@}
Կ蝨WW+-6p.\t2feUD2#eLyIRś:KEś95fgmgGňi5@m{6GX+oh"\fI͚6wJg3!{>3~^[秤Wp~*;Vs6m=o6{fb5-uTu~4nz=#:7B +)9U +_wp[d,,~, +\Љ{@ +Zvq</\r#;tn1ͰRX b,c:XzX7pup3mp;;0wݰWw-r)/G`3>a?,->Vm[
\'`r'.
OӸ{pemϟٓ^x^/W>k.Ͻ7p[6Op>.| г=ɏ|ޗK[8ug,1NS|nWvyչ_3_-+P<1~דxzo5GV?~GUPw/K<U#{Փ[t¿PdgãO.Euxٻ?a4WJ|w?
G[<O-G0wTˏqnSJ:_0D<:iUb +3-352JuJpZ`Y,1# YKVUbKa(flWD"f2c:~?+DK_b˲e +saJ=B$l-ce0"!ŕ9`b2h*yKǽY(ō>F%A0 +ݠcw^^VVW4f0W .G$K?*0DJ?x/ +/ +ڳs! kDR)d/Z[,˷ZCٖ_пX5 bR,<eXޑ",IX`щAAbIge)HSHAJQJ+(8H~UF&#;SNr\nBWqrN#(J7E҅!xU!Dݧh::5.>1#=.=d )/iBHKGOjuD(FmIVda5?u:L
hYզ%X,&. +,1aNbJJJ¢)'ŵXI1s]w/;y%s
syYEk&&BDKZПBE,bԪUF
+4is;J~Q-y+6ojJH1#$\#)XKQD.lZM@()3m%w 7
tL'#G )EFcF7΅J;cA0PzJQ7Z̏M5)
qIq8k2H?ҐdڱGȄ0mJK/ +KMϊgѧ#2ĭ1IdhǷޯ$w쵴<@k$v\%FjcwˎlG8\%6c;gԥFmVPpouPI+*Q%ˮz1?`̨V:$86|zŨ%,1ܮSkذ蔤K>qZKY/)c@\'[<N1jKknrq1:Nܓ>}BFY6cۘN'zPIggldv{Xaݮ@Hlg/KɁL2ɩC;.J7I:8DP`:s5<ܹ3 +ީooAY1W0$`]QUɷ)xƥmdž#Ϝcw|{m2V*ON2dC=2("e-Fk4QqG_urt5>+nCK2fsɸ՟Z!,d7L\kZI֫JH/S؛=,t8[oB,c،1rHc#v>ϯ#uS0&^140'EDNcJ73!|57QfV7u!qvFM-DPsg
4g [XgZXL^ܚ&s8 2mlZozA(,I[rm1i7JgTI,R\)]0禥'jb;bWDi[ѱ}^C+xGj jCJZcGTp:F!бDu8y03~yg*y`&6<[caq|{FA+OA6͡egGj[LL\0m[JVH)jbv +21:_
/7/h{!O/<CNz,|d4q!GRy&!;5%;^+t^+%f''g' mf-X.1c@j1-mp3 +ov/+Cd}RBChS`JDZdElӀ<aVadF-Y)FƖ,F?|SL<d3)qM#LyzxMbtv&K^fzlEт$i-N?}5?#%tkEm-% I-&,Xfd5݇j:]g֙YS3&raZU(x +0{HHp|ט?" j=4oK}7b\ϖ< +ݞjSVU;C-Uk?uTa
I2\)rOgt s-2|}{dqI%.^>܅Gg`H2*ZK[ׇ6Yȏd[|oʖS߅$y$]Ԋ9'6'j.lϮtQ ^ju6v?vUtS\}4Ó;}.2Mo3dw /dCԭG`apxT?I)5=.g7cjI&ӂm +o(oMZd*퓛F81_WuZ{Ujy˫}/J%y.o`;@a 63g"b cOhҁl!t_2!Vi},K6Izf(>U\w=?9`;БdiGnC%oUP寴tk;Od&2f'R2#>4u4?8ݼ`ܗ-Dy-FEO0:uο) .g w1N\xF(4|Vm[
4cL\+8V&Ae%ag ͬFsua
W1T,NEdž֞;ִi$4Bl+mٹ;1 Mק ٶsp}pw61:Pg<k_䣓ު\FȘ&Γ+~@ѯW;ZFD 7+E*!5,0w :>}QO=9DJGo`8[w$5c[
S0ͿK|0 2;8XZCcI0 Y,^siG_?҉!Tޱim?&Ҿ/܋u*f@3jE֜4J1H[,ƀݹ^qtN3XE㋤.0ICT/YCAz
*[/9Ų H.fx^?&TW+V$&*lOE~@=c)f&i35!5cYx%NSP\K{I*,z<u +]niN}ŁPLd$
z f,zY +2}\YM#46L]%ic]a6_Դ#I9?}H5volwo{I*yLƪn8$ςUGbz֮WNem)gЕ9ʴ/#WY|SX*Q +?/s +,a[X3}oI1Ol6G5*ĊjƊO7S؊, `*a |QT~Z)s F;>pyln֢d}:Z7A +ç;QB".Tz@G-53hخ3ֳ+bj܉Q=W5k)E#kUw
غMCVuM>ON|GLJ^hͫ=U d?8>Gy˴4=ړ%٢
>v:QCs)vJؓQf-O?*$xP6j(]*#zOb<UVD5ep5p\"wMgNu3zֿo1+Z"U:dȦë"Z.i:O(i3
:w'`4$^;k3 d7夕)e6G. +ߝAe +oU3 ӭ,0X*@NU|q.!]mU[]OS쉩l16
]IIVmwIv8"qb_|_ݘuM,e
{d`3\k<)z]N{Sr"Gaou< Xzv=S]+._Om
tdӖѬV%D6uxZ:_Ě._뎏FV'X1> 1Gҭ\ۏ߳:,*g|z4:|Ɂ9g`:HtFkj1Ml/l`Gl'i`>6mF ˱&B`]U&%;7nKd"2 I;rJNAD.A
#^zOSչ8h]Ou~`;cIx`YۚDJi3mF9[Z?}]1<>6YÃTL h#_*sjs9IO* +͉1IXf3 +tȢgђHrRKS"}Z
V:U''7N +KA(n]mE;A-װ&mBJS}j+ֹu( +/
{[w=)M
Mk#69+nO@g@cvF^gs[\V?VL9%X>
ZDV#N=t㦎,r*+c} IllP(ө\\ S-
"]eSV&Q ʊ:[M]aMSxAaH
`MNYwH6]Kt͍P)=Q/.WU0+FԼϯn>s'M~9v{%6$#|ۄpH{0'E8AZ!6d|eCJϑZ
U& +
;/wV 5-VjDR[>~SxxMV@10o#}?*=IC,lm
k_|D^ɷ7pJAZHY#'dwf_ n3ro"MnSf_t!zWoy$8MxH}IKn`B}U5N%P*U'Ȏߒ[|&5O[vdj0ˤѥWF6w'^>![ +.'{oLB %%B"Oέ_ +rXc؏|܇܋95`O#r1G'ۓ#qPï稃C[^HVhmFRdiy{oZ.̠擒J8NVQ3 mw@4 bQkmڶ.;=1U~9ҪUb%!h=;5jOx9[JbuzVK>5tǢ\5L|to Ŝ)匘k;z&tT*jYWíuV7me9W$0mF `D[diOUmʞY(v{R;D
hG!'SB`IN%*m! +EV;BnH +pZ>8}Wkǝoߴ165`Pv˩֩*Ak*z79l>V<ZA!cӌu䙶^Q\6 +ٔNnvR) Kћ&uD0[nkdu6F˘Q$(N}b$q:ȣApFJ#ϸEVD?A0qT?8XSpܦ|~CK&o8T$mn
3@L药pэ*w
5 3y`U]ϲ~=ՁMu{xWWÿewiթO9Fh`ovD-m-JԤ-x2 +J q|=|zm)RBz +aoT*
\sf6J6_o[v5b\bZLdVƎAEm\@:ܺHT)k?[o?Sj +]k~luZ*as, +Gk5c"B2Y* +JW'b +t6#j~=O%wA{)0e-ctTl;jk5`r_5܊ + +I~] +Φ395bNɍ.-`7;B%!O"""E۰nqq +֮.B"JǐaxCas|?~w;cX.~t\W3IiIP_ga67jl +6v"?Qh(,SS ?$ +g<gKőBSz\-~,%44PoĦ5NAߴ3۷>)Z34vR32;9d#]c+"@oXpƘ/a[gWC>g,Xy,T+0B=FDZ'*R)k#0:Yð[d7dо|xr +s e0?;* +̇=F\ѴypOysb[Ahk,@iy(U/ Г$]R +M<omʃv`Se,EE7` +SZÁTH$.%0M6,kB
VV"i,蕏5bY($P hLB&_Y2xy +5'!F +]ipw|F=v.csX'~Tz/?
w@>hojFP/M +n}-㾺YtW`jS +&L'UB<?$^\`QT/āeV X3FS(7vQd4>h +)+ٲ^tZ{qC~bJ(B\Fpy604y\KWp%vKMF'hvopq'ۙ4?WX4Bƚm-gt<v߫:j[{wb1?ÚG8PlF{yz*}/Ŷ3GWƚ>63ϹDT&P^F[m>A^XS06ִמ[|&%NhT)xLhJ9 <^{6bvF>PWqb ,3m|pfe?K<Kh+|Z_"/\yƂe"U)\$H{UO4LvE(TΤ-Y"3sJG9(9Nm5i(Q742RHZ,d4m Y`X8Urf~Y؛z]c|7.**#a7ml/D{lЇm~=MJZ_jmJ$j2\D!.pbυ-H/YbX9'NY8⯀/Ee~SA^ari41 <{,SO>HXަ㏆G-<O-AQtmQfkSC{H$ط`̗t Eb;Rq,QhI{X+eFIBa1d>٧{Kibr"{}YY>ݻ\!zriUQk$A4
JS^7 +&~$$#q6,6luy7 o70 +`kcjXJOU/Z?-į+t`W}dLXdփkC֊F}cdaok6MW=!5FmoA3W']}^]{t2ȍt hN9)G3xؘ_a2')s$?/g7y5/&Q-(k:w\ NU}"ktN6,R}/tvs&o1cROl범`R[q +N8D|>ĘܡOy}1A}zާ̴M8)\&S{&_6m~V<PRbv~^~5:b@˔WEwD1M)6yuWx]ifE5}/_-;45ͮ$#3*N2vn>Nm3 WR9WT"L9a+[vXY +)
ߟNQserQRRb]oEVvp23Qp%,l
#ѥ$e m~W_ +G} RamvIMj8jyc#l2**ա7dL"/;`_y2(¢3@5JǞf=/ksT +?]@3u,H.+G*ۯiV W
o.$l67_rPd(l=reIYҡq +ct%ЂΔYFNfG8u>iս69b>9x!*CN.C#>wR{8-P8ǩd_qMKᴎ^ +j_д~㔊QMڷ" r +Qt:h<>x/[_}ZbK8N0eS+cA\Dia'`b#N]5mcJ--Sh_3*RTIq'#l3~AX3O(HLO'.ы_!1%b)&Xԛuҹ#ő֑BCrOs[`Nɾ[Ƭ>S7lS-/sm8FnG'"`+O+IeHk|8Q_ +*3 +e]*T#B?/ ; +<bߟ
mhAjN+aغl쎘WErFZH$mY{:OCkHi;*TWz4VK9jgoFWE2V.̂'XF4Z1h_ſUr<Y9[yMnyR.M%ђĨQ-7hw\Q8>6xxNr{̃j~еFȺXvU_}OWÑVm. +p]$Bͣib6VhhNٞ+w,_V>:^n_,U-<G,yOFc||ڊnΪ}X{b +_{e1W!yO \+kN +QZ_8\Wʆ8Rՠ1'G6S>c6K<m72ŨCWgښV7wyXG l{IdܤFu Z+=)w®BoeǦn[m:*8a
(EoY`l^^nvUրpturdi_oٵ(,+LA։!K+2KKaMkQ([-?4.:"->-hbu_[%ߠyhZNgTwhq +`Î$q\156W~uó댝iOHu:5<uꌭG] ]֗]Չ_'}]>߽&eZF-䢎FevXe9c]KvTmajj]HxT0mW"89P+ +JQ?Xg2[NG@ո0.~E`PCdGiٱ,/02U(yyGid>}w>MB&i(f擋Ң$9aň'Bm
gҋ^t2T+lRm3<魀i +h~Ƶ^ +"s_eǶt\l'$\L$925bOTdv'l-$oN,J%&ʼnunk<~lwY{ȰeiGUv۱=f3ooSZ +%UIv`!Tog3e*3*qr^Fnn/V͍JSzw&i)7.+*b#?q&8czKt\r۬%loi6ezX߃ 5id@*_>Ťd]fA2ګ,W-sFpq@j7[ܷCMѢ#]7vK2\e넦.k~4Hoi`{e_۸le-9ɬ[eu/[ww
u;ɘ9|i_)ْgxt)1ym!j?'sjk{g؉;5Xiм8!bpwÇ/~Wߵ*Z~ +x#$ YںY,?[pvN 0^YlO!_hDQ^u J/g|Ixh(\fܤ
ulVdķN)I.79(AqLUᘶ`~a%C=|ZSuBGnw5qyf[Eh&T +5C-7HƟ0K]퉡궢TX:d_z}u\_q4*lY,^.eB
mB\|oXE;: sK+;.rеZ&9#7VyzvMttޖ5%ݱuiV!*/Zlsнkq)k9-dM,%lHρ%u 0wP4ks&d+y"oԱ<{ 3ćd̡LPNX[҇H/j +
ѮXsD?1Uwπrs,<:4r.}P&f +XnAX[˙s 43˯%onP~bCZhG`΄&Z6tzm-oCyǿ=-w<3:_Dm&yy<xr}A[ +fe#gKg4D+3Xͼ +?y@ +є+ҜhkE8!1x20]|96Y;&U/p{ըn]'"RӯOrI1T(2
m+w~ducj]~+ +!+ϧF[DsfȖջ捻}_thD/* +ʌk+S3
Ixwd%t ҖjƠd(Giuƛ{*n/hK&^dj͙)StPՉ9 giWUh>l?։jpa7=Y6`7N|y^ +(NG@ޜTM!J*nC=>n , +K2f-{,M!N4NcY3,Xcdzj*F5>%]'; +8DE@ +T.(>9JP,F>C$Rsi2;KD"#5om] ,@lnM[> WRbv?l)9nYbn@_w;@6ᮦC.[XΡwS{h=ot%=hWۢA?oC%Zt}v8Fh%}c1HMs|>n#[ns-3xzI/ƽ\j\z:6]{`pw>QWd]v֮(GkYCSOr;a&x"?/H/9IrW8I$_~Y;7$`Q)$7X(k +sPU%OۗIQ9[UuuUwW/Ll3 3# "kHr㻆h\eP4h>͋7k_јD<{Nu0H;hW>;o;մ`4z߄yFڳW".,1#}.""N?m(脗ymdu乑^}VW;ώ߾d/TS{n/\y˲xowwỶd"rܙX
ώWu.ؑtT{f:;=)Xp4:Zj#5Do=9dq,O->f9Kn*=7?ugo4.rG'}{yev
{7c[\5eCuVfh/C\$Qz!_߄!)`崇HJ ZjDnbk?A=WMbe[]l%`UHb{jѫgٻ:ky^8}+栵ֶ/ +Xzh)6^vvAmyߑ_Fw}>VgS^mnKdm!-jUrx{+wvmZ\mHgN/aMxa \:^65hdwM+v^7Ujejfmd@JD?Ԉ+dJhag5ʙۆ;ΫH*3OT +{Ҋn^tHwb9/Rw +\1\0q1
dFNl`o`W%.KN&%et11'4zay. 2
̤?{pRRM8kkmV39_]t$kԪIEzg#c{>Y;rG +[iduF*a9m-E`.cRMȍ߂-2%s
r
4g>ϞL<ţ7fsU_u%B>B,F+O].<>%q9fHObI%֚#v8┰(jR +f"P[X7pB6#!<눥rDSOW1Uu@3祉OͺWV+P5E6}kco{zP!ҙt4sw;*Buӽ?{҄=7{V{PZb@ +b)=>( +!Ϧ|ɡɔASpWb}&6J +,-Xpt"$٬k"]˘lQߠ~#3R28~3?p-wN"JQYSPQ> R@-j +T @)G3<%}D~.p^NmLf@Y9"(\O;Xm5#wS eeRḄSzS3&Ã ƃ6
J6a5$l9Ou^:0s ̈́\b1[uVVH}םź>X|{Pkn75cA^yOse^L_yTjSN4q%;C^!ڕ-f>؟)m-$ŴuOh6r:{ސJ!;]`(MsV +t8)VsuNR+ `%xig8f4)=Rъ[ADzJSk5Gxf*/5<B-<2}]Oڿqn?#$>c7[:Z1&?j<K)'?|yrU .t:b+P̙v\34~mjkfax,jc)#7Y#X +IԚ<b"r7}HSD('C6>+qxoGA3s S`bYs p_bƾ}vYXp|{>1h=r{fiag+EΈ.tW|ĪKb*-Je3CW_If%EM!qCDSwq~R8sĊW^x_9bXJ8n`qz5N>+ȵz cR: {cD'aDɣ +~鴶<$kCͪ8wS7|8H>rޢM}N+/=h4ZWت۵,[zks2%=\>/[3f֖Gꌕ8Q^I~h`Ra~]kz10Q5}PE^;hV!y@S +pۃnUjv&cMc;ϋPNTQQ◽yF]m^cF[2sf+5ƟsE_60n5j@-^1p& +H{1bj[r$'CzQ#/2 G_(q/~u|Vno)֍~@կuytgz}ݼʚ{RZ艻AcV{Q=_ܚG|)=調s>Jii$ +/LVqn520Zg>D<v50֫5UUM`PA1w"g'S`=]
Fr'wҧnD
8K8Fb}|͕W0#ƫ?|2oI2YFQ}3`盜h:zV=!(˛70+,)3/;\Q(L3V?LIDoҞ;vGz[[w87$JY˛Ƌ]0za`~tn<o5#AݍZBzuʁZ,JK5@[J^7F*ҒER*G-o9V|5kp1YK,S]Khb+HeFKqbq9q5qy_kWlnpupvp63ͫg +}WovyrshӖ[zٿ3wecbq1lVw)CjwR.۹E^&ϥ%5˝oxRB>Q&hU5gy<s8<t#_ +{l>?~=
kOr +Y
#J(o$bkx4.Dnd +Ы\Р7᯽\R
|z
xB]]mJT&,r`w1u jDl x85b'&,.IF$EN<[^AW|Q7gUYO$cB҂TȲ[VT#qyqמ"/,eūgVf^+ GF7>' +O&u֬f>UlG?yp`o|/<Oc^pc
I$"]@FtDmς̉cy +OTQM/Si+ϪߗkD?B +$
MgݾyՃ,]K+e܍n7T_%|noY\B#2,aE ~J ,Z6O +*J5TXr<o1%\Y();ė[ yJy4+[`8Tze5"JWZU*7\kT*C`G~Py 1A +@;Ws"y:um\{=ռI\@Fz3xl'Դp{"`᛬eR1bDW&ыlYPfUs').e{I5Iޜ.xh!YcK6$?@oyzH AFâOÑt!2I1& +ch4U#FfaOL*<0?X)D8PĻѝp;HA_ q;|~Š1t)D9lbb΅y"IN){Dfkf&bТ)HX.ZQ`PE]c${h~FKi#hńqAǣ5{mߊa4F
ccVqx1Ā_"6/jM/K 3="ڪ`6܊Ϗ{?G33,#Uj]VO<VoW +XZqm4 +ŶA^h|e0zSc<&\[O2xˁRlsJ$(jO9)S*ۡzvѬ2xѵnč2.dc18h'D|/k#s/pH3e93śX +a#b^2akGʼn'mʀ{LƇ1<$?4ےߒ^Lfx+"Bx_\T-?)hMt1OEfR\((f͜&vOxFm3J +:w{ޤ|v'p3*5euݴc+/2kE@RA^QG4#4̄PcєggY{|ᨫk5X5{125;w3[Źlɪv^e65bxS{aHՇE,fJ;xb֭bХCtZ{052|Wf6DBYf:W
4KQUY>Gvp^CU]HCsHq'Ѹ#ʃͣqn59P|{wsޚYgkXӟhPFg̕k +p`QԻQ*ϵ}&`34ӸezV5ow]鲀#3]v|d7N$W rw-:ɻ)dAGi7pm/s%)thtY)K`2HJ-&B8˙8ꠍ>{v/C#"A qN$w&!IRhle4F:o50Dq0-%ִړVjᬻopqJPݕŪWۿt\?(9#1;Nc\,ML(o4.Cϯ-UEx(, +B"]C]]kP9M?6#hMϼ~5YO*f g`t$ol\nw4+frIS +BB7i-S#tpziZVk']sI)`>c
./ؓ_iew:FWUeB{v.4kHFb:;F蔂)5Чg'B˪s.,xߊLQ14M35v*s:%]}EfWJ#8f$Pι w%N +B<C:::φΦIt
l~
IVh?-Ho/0jdBM{U+}2Y:,GJ) Ȇй^CYnUnݲ9sKBI]|Ggl%{UΜ_Rk2/4D)(a30:L3ݬݶfݶmftڌ|7ʲ&&Ιy3y~};qjnd(}i)f%O>1wIg?K2
.V&.yԣl$L,c"a@KM0Y3v攱?wQٜ>aTq?Np8qԤcGJTϞ0-wȷS<Ӧ7O&CHv%~̈́_6DQw.arˈrTyT鈊ZȢMDwsf_u6*5o&ƜM""ӎIBqEbVa0ȨyBcrbSN LI,cbiYN3Q9tsX9q'O˄'e|{1IL:&.LVH:kY;kgTs3eS?arQYst2hk#91,37R,ߓ$??k+g]r>-Toꗖ\
#ig]sHޜ?z9;g\.3yHd3syN2ĈDܺc7rgY![v^y^<E=zS/>Wl90֍6u/y-d璝[liһn_}Y_Zk+[|DQb(S2dZIjI/xtBeƲ}R>|uV8Vt\rcCn⁊*vVx⭊qחI* *| +|e{ʷ*߭<XY7c6jYr#o͋K\PnG}tjHŻWO^]5A*!5-\{M%.q˿̋K\%.qK\24؞AUKu$;suĵqK\%.qK\q˿p5KqGG7k@l 'V_j\qBR[wR[mP%Hm-wWR[ljۤ^-[Om)A'XS[9^{Z9R[)Jm;|VrF=R[#R[3R[-0Km-7F/ef 3Ε&pFNCqJpfm3k3Ygf86Ùάpfm3k3Yڦxf8?̉\:gҸLsn8O5XZOqR0y "WsAs7݉&.*(6tsM%rtGZ5?>iµbf7i^LCkEk>D[/]^-Fl=F)Ǹ9=[~fȨ0G'y*]16 +W= N.JkE:1u9zQ?|Vqe(Pow;~pc{RHڱjBCU6(_7k$9^KƩF#$)A%M}bXiV.+_w/YHݕR
[ff
ɄZ)sUuXk!Xy0c8z%|*2jqGFzz=)ќNQ
Mzx2 程ƚd?
FZDo=/X6Dd9BP7/8`OB?ONNn5rσtTgE֟8C'NbH\l=vH&̲.O;5X2U8$ʼҼ-Yᣖ R!N-Ir.&C54Hl0jcY+61]#h湟P#Q{DfȄ"іW˵!sdY痲"v)^f0-.o괋V7YWE퐣<<b! +?F#>$T%`'bN$Oord@qrP>Y䩛2C9Ř<v$qn_Y;63;D#rv zRkALO/B݈^ZG'}HVzޙW]Oꓓmn0=dV(^)2Q2C1w%IU7z|:dfu2|5
gBҰueiIT#`<*\;vΐ;ٚt:@?LGCucqݱxS$?vYySD$`= +7^)t^F,}GO9S\^~XDS nn;%:o/5t; M<=##gSC,NZ}ґW\ݒU7W{蓂{߲]{(k'dN~b#Ofr!~LVs2-.餪2JRx"6ȼK'j ϼ=itc?G4OWNN+1gGG1N|RK}fωjЫVXUI~|O@ R/Xt?Yl1^NR:R1U3+h.FcE4?FCXqLG)ދЯ5.ia}tk܅t+ѕTrUZG +I{ l"\Ş! +3YZq1P +莲e+|i6>b??"vIfSf3]%XWFϦ>3kygXdWR!1"B^eS5QrK0[NOb\K=-Y%̈E*zCP%䢽?K"ؕwfKiU*_C+=+"R,KwheɣˬQc ۏ69"ϯ"}<.l ,4閴Lq}!1M=]S ++L1廪7]bW=CtMrH4[fȯdvXѥZ_}kA<n#J;bA_}
K:]1Tnt-.誫r9.at~ +ݞ`J +v
BK]-Vܞ&U!K[4Õ^' +QA!Zhx|
b-u~#$b`
p |b/_X审F!WcRDAm);| QNm#AF,]D +A]UJNIF5!xߑzG(\L7@jݎ#Ȗ$Fc2&!`(v7(Z@Hrc +Ɋ|@>yP(CK%rH4JHpHp8 +X +墯 +K@b-{A>N<C쬦=@&hX&UfP"8Z2nRiy&DdR䷋⯇CZJX'
A)Ka*HݬTFxlH#!Mh/qQN(e,H~o>Kq
Cʰh2E +֒35Gd`F"Ϗ@oˊ+KbAXRZ ך+N.CzXQP_\ĊJ8O.&KJeebqXEKŸg{"PRU`-#ʖ[Ks^\PXP^,yP-d(.KVY}.brkQ9"֕eمtڗS\RYZ$\/.̵bpe/.TNavd17{y+ZJ2ɺ|+~S^P\D).*/E7^G.((&٥eb'pbY8$"XB+ʬQ[rمUF.]b4h6р?xE/A#GWC?&щT Q +M4s^ +_s|~c/rc"dכLd`;ddE֫SN!Oѣ^)7t?T<MC!.梔ZPnGh~íp/l7 +GF{n>ďq|?Kb~51~#[
=eokn~%N#w|Bw)_+& KӄB"KPDX(B@V)\M&s/w _)z;Ê}7·O#> +$F06&\ +l6kf?9lzAl +V \
l~
l~l6C`5l`3l*`6Jn61l͗~XܩP`c6`6mz`s;5y<lؼ +`6A`ln66 +b", +l~l6ہS`*lo+v>GN|!!|)$`lV +S3"`ج6F`s5l6W`)9&TJBaV8]pf!o3R`Sl&l +5?)QLW+rxfl +oE·ʵ_S6G +N+VJ{jh*9JZիqZփ#owkС`[tW3J{Dk_WW_wWWlpoy̨-Ŵ + +˻rb}jV8,&Z'0pd n`jusw?ݫSp:@1
Nٸ<L5gj-.y1S..xݥQ B;Y-pje¬[z4AKP5n&4t蕽^\P.j*xj3JaP! +NM)ԃZӭT*
(=Supݵ^A൪m۶RY-IHVbYtfn75ͽZ
?Tb![U$2-R p0,.j["L?ѡUZM|,'N`,;5|=T[DO㵆9kuQNQtI']ը5rZc⳹!-FYZ#!E?:5R L&ՠ?nX$LDZzNm8J̄nAvEFhPkAF#K젥&Ӄb@[8'HS:FX%pR{$DO #H4#O#"et-lY'hEgl4@'Cj'n^كL[! +0eNH?iy1R]aKޘ>:N@]>XQZaVSn!pH_IuIN8e^4֪֚ +%e^X)4eRՃ{\fHf36?B!V9h2I{,lQ-QўYf6yN
EgPʌ3dіGz#7Bna쭛 iВElPX~pa)#!u{.}A'{DYYȩz!鄴҉([wIrun~G::G/[ZN4K/ˏ~"OܥnRU5;1l1[enJZ4 3=M3o6hxxZtSHF:kXz7lD2'&HwaP`Pm%(Q::hAI2 +1i86oqy,5PT;IL4f7 Q"f㳲<vم-=4R,ccdf28#ͦQrFqrK=htA/1]-20ߴf5P``F[ؠ
M=JG
8;Yj[t+]{;`
==i⍭olݷiFZ
z`$ajaIab;:۩o=
Z;Ji֡J!7~Wwy葑i1-(͒VPL951JrІæt6Bs݀twնt7[ qesh)% +\ٍ +Kk~L(큁C4ehLLyڗVsA_/n22A{!<٠< +TY +{0O%15lݭBϙLpd<j!1iyt!>lΤ^6MؓI0g*Teq6fNdƄFUlA!;Тg3)xӐ댼.qx`7<n"{*#E"!/}p
{B)Eu'ŝrAy4 Ufs+Ҫl3($tIbPNȤF2)h"HTR/X
!7iIFKZ +%]4Z΄TetlkRZwV4YJzscV;t#b-4T芄HM-FVLlw'o-퇚ִ$AI њڤ&O-4pz5R;%+I;;`Jud1)I|{ +hG+Z&$AhMY:&ZƓ#~u/meF:/d[&nJg9ג17sUft-?XfȼaryqIit٬;ћYEkYt[2ζLaѣ2(KV,¼DzEswⷞvi߱y3گi}ãkZmybےok.jݕ7.x>}OoznYW{c/Vl_~v_Gi4~};{+Růڳ{/2/=XSfrSu杧zޣ~8{cxCKLދ~zFzuϘoU>z켥?}?vV`ʜ}в<7ޓS_m~<c|WOymW|~pxQY& +e4lѢU +aHLqܛr{_s=7ެny(t/;jr'O?>4v,xuuҴC)ƪܚ}Noc~Jٷ־忿'K'~;'eޑ*mWOkjʗwf<է|;噳_yiɳ]n=7]w)'/,Xe.>6_~ی%2y'[ɼ$ka]mE>>V$S7o&\niS(cĔ?o%2r,jx,"2~R%kX
4Z2,iiV͢]KgON0vNm֦lkvܖ=kM?;eM7?<߱qϸ>{#ǔJ?xޯk{eIWޒsc|1ι|Ug)/,wlxHo^%~1/]恛>8pڮ9g'?rfU~l_W&~~=B=.a횹U~hW:xߙ8>]_gC5}=RWxg\tWo|3fVn&&r2jSrgՕl~:X7_}gGoSEYb?iXIW5zfl%-}#2j>kιUsfI9+sY̹isCJ`Qꭶߞq֎^Wz8b +"]b$0ߵm%c%@{L \aJL r-B#1|4*x>JgMs&[)]}?G\+8nnd'YK7Pɾ˒[CY2HgedeYoIɖ. +%=Cʽyuyrs^tkQ>oʴNcPj +np)y]?6*@1*_ɬR3ѦgŅ?K&ZʶT02c*Y.JtQ k +Cݭ44"u:O 3k!-PИm"S)vq+Ght峍5\Z Btȣ
bǐq0±h2n+ي["p%fBj5́C/bs݄NwO:~~]OSGvjݘ'zİsQ>wfp
o9ui.n>~n^dˢ0 uYTt*>kTdml5
|{W\X<u@{nϤ_ji>Wɡ=Q<+ {XgւJ-9G]QEo*韗VOmHS\j>J +杝ֿIhxBR"ֹk/`o4M*#`pH3cIr/IIWi 塌7XWijMw5rNi0Θ|F=^ĬF
_0lx
i"Ș +Nǡ,#AY<czJl xS"eW AIt+T3bB|ښdSoII#_w=a0`āWBn!N]D(@f+|c}Hg~37B &>@O=ta.G%7#"?O=W*;)gR~4U +iY͚/zsܻ+GżxQ9*bzChz2sUۣF]qn('ъӉuS5=w1*pBLIu^?˔(VAIm<#yK=Cs
QA1.^E:m ß%o(8<Yo~pA +ԃ+mGd=CfRUv?!TtzV\
3&Utm/˃h+^9E9rXErIzp;ܿmz܆SV#g6&RxnX>ДДeB܊Ox-ZrH81\+ӓI'KYv*n#U+*R.J|7O9&tuƲCvqQ
-~G8aD`rG=DL)yP9vGl (X( /?
|8ohPA6P +ٽnan4ә'0@Q
u4&[|L6kfv,=x?JFs+F*][3C:("VحW0vU/,4`.`ʲc1j~i^~K V۳iYR*^٠w?n(:n$v?Ӽ^60a:2M|jd*_?9zHRF?6[ԉx +mg + O/O'?M$gKJ +fCҙS2UCZm>OaMJzN4k\u,(Saih6LriKgjqW Ejh{ހTnuLt5V_XZ0XSUbJn<1%1OK#>}2l%qUS։F%#S"#d&f
9q(yGtOU|ma) u&V8;twQ_2%-LĪi8xǛ=D┲6[c6^cV7V8Y"cf/:LXS_R +zJEckY~iTYr>&}lxz5VG)3L]pX@~~nPg4/ZЏ76=ku21\:߆n+>oABgOTl hd9͡3R hIv_m+!:₹FjwEkPmϯhG/ _8J + +8B0LBa?=Cg'6S@d\?Е +endstream +endobj +198 0 obj +<< +/Length 63774 +/Filter /FlateDecode +/Length1 158956 +>> +stream
+x}|TU{LʐI%d3ɐ +UڗHBԁP_Gibk֢;hoORIOs͇$_ +TP5h9ZszBM
hJݫ>}WZFVN^AQI?Lԍ0LYWTKh!&]$./D%< qX/1x^E^WtI6Ma&j +7E"MQ&-(,ɐւL6.iS_2?x3pemg͍4j>;؍ߙ)D+0[L7U/mWF#֧7x+eY:;Bgǿzvx֮YΩ}Ƭڙ3jOZ>erY[2qBqcǜV4zy=9Nzʐكݫg4gR|=nM&gϨ2#Giw%m~\c +#>҃GDz8s(R]CihB"ʊ}ݥ.^C1)HؐHME WARm/*\EM92"ϝWѫ'5GDBFB7Ä!C5d~=?WHM-5|g[\dBWsϝMizEfTrϯWP^t?&Ý$ӝ_t ~sjy==AOX'R4!_iBC/5UMGX㴋;,k2gIʜFsx;U>$tW};wU+k<o%>'SkAs,WV`4Yxw.`DQ$X秊`)VA엫";(rvP]?~P2 +|3 +G5ϑbJݾRvh.h(-VOsi*ć;w(2x\FR>ܡ.p +C+Ճ7RfhHGji*ot9omSC}v5*ovv~jr.
U>Α*KO΅OC5K>$ƻ|wk3'&xEEe>iWIIgsOV -k0ӡa%G=JeeIOK,aλ?.ퟞNճJQ%yث8܅n*[Z75{<M*j`_4GU7':Op,mR(*EU6q2;_@Z^EnisWv<W^ LȚ& a5;<DFpAϪ|Z4ٹ!U-&h|V5rt`9v + +Gh=$X)O% +=r#kd"2,"oʨ1fiF:<sR:/H(T`v5J硫21YMqMp/);mdAߖ>o7. ;[C02X.Zȣ08ZZp/Mmc8;O?rFҦ#əzZwSv<_V!6Zz|+3֛@*ݣF%pѱ}R]ե2 +]oe
mkڨ~J`ffdd.ȳk+S'jrC(<BжǪ囎Ŏ ++ +28ms3U}!xPqU(:+`<g|qUlKpS)u-x1ͨq
'Ͼ)mn>n$|tW+y1n.?"3܄#oSFդ +e<JRQ2U80<]\nI?1erը=W!~L1rbBOS`U9di_+Q~,PcCF80==IԞ +K^[ස&
_? +~0!?PT5p+:`٨IP$|Xl +4id140(r9o80paL2
SpLL2
3ZNfԇ+bz1dd:Swn\uS:ٕ͔U2S +Sg&Sr y,SR y#S";yvhvv`1Eq^$SS8Y,LaNA@bIg)DVF8_3p3S c i"N}ӷ
f˴bcLsgSpcvsއL}0.é +t<f$L5W^azC^bz/0=ӳ|I'v1#cL;GfCL2=#s~1m
$ɠf&?ӽL[a̴@"kqr'w;mL2t3MLnnZgejr
w'K9o=%L3c#/TL3Ǵ6P ZH:iu a ^Pc XHZɴ/rg1-$Tr%L150-dZUs3@9i6L\-L.^T͑ULә**1MAsϦ0MAqեܐt$n˵0MdTery
į !ELQ4@y@*P^ -
g00
.N@L)!43ebFb|2 +O%2%031r.`gg4S&SGFrd;ÙL04s:$=)q0y +~`~O +-2"_ysB?SY'm'l3PϨq1Ӻ +r`p'$b∙u9/ùFOwg;Wl9Fٛ++7F++VbӊVxb"{yڴ̻ԻػdbZ.557,llD~ 4j7zM^_X7]QhiݹѥY^o睿iw93Y3fzgdW{k6U{{++Ӳ˽S7{dy'o*f#~Rv;1;aSw\XXdyOT=;jHBoO]u 9DnDZDcCNv&k=;qļN:]INz)I$Yv)ӱGBJ'91%3`ՙ(N t[M$8uA3 J2Z4o?/O2~M5qq; xK%Fzͺu[O7x*5!4sꂆ>ϩ;=QKv-:ZDGFkht>&?Z;}Fۜ6M~D
9nQK +#7'r\+DSx8qr˙cꂅ7RA&3W~/Xj0Ҕai`soO7Gw7yjR88hV+r,`X,
B`p&0 +`0( + ` 0 + +Ol:PٳΥ5xjto.8Bbz]z|]Jz@tŵt+
5t݈5#.FC܇Iнt1U55/399XncŇfk%.iSbQpejDr-d-+#{oy|\ff5RR= rVՍnPF#}JYa({nDuXU[IO۩Vޱ[!z +yvy_0|?#-8$=Yz ^4>Fez^
>O
Ǐ`ƿ?3s2%_ZxJ">ppRcm?Sk=xs7dƩ@NLch,]_{l$q} ^Gpȅ;D4aQ-:s|pŬWdٿ{1fpV^o'>ٶE
19'.ǣYա3_|1d[*bRcw,0wZom@<L?ÝA3|;+0MeaJwΤ~.09)tC{XtKnZM++H{kƦ$&Xg{syStկj.IN:%uԤ8)2hDuϟr`mBgYGx^/-r֛~.ƀd?o2Oxx+E"[cؙ!^a\w5P4ϬɊ<8+ +?9è 2D6Y|[8LVC
x9ILZ.FԴ1K&#acVl0Mp豚"L#bVg79ݜXG|#zp{d`_kCKͭW7Zm̗%.8_qW\pϖB]R,ָNa-ִN^ Ԭ]1Ji2x[shE5fԬ% c4JNJbF +
﮸Hݑ ?f1a"'#iE9's$;-?0⤈(0$6lh7VM,Y-g):8KfI-"b[ZaG`ѳ9k\M^ÓV3zy.VpKu_'+1Zg"zl<1KCUƲڕvF1r/'w8(F.3yiieʞlr +U3_1Gk#c#bL^=L*k$GƥY3zgmzd槤i] +9go|s:xoG3L::ZEܞ D'Y<s};N,2x9 |Nr'voMXw +_~hraIGTFoDFȵmBj15:>UDI +DFF7spb a!_,iwDj$9Plcjr+b=8H8+ںZzE-nYڒYEA$Y)cCY C! ɐ=&ؖ-p3<f>3y^yHbcUj/@2{s99VxA=kP:p/\Zx%k6w`R%fUjPX5(V
+++q1Ҍ*YIt1~U6ҔY[8aOg*8A
Z239\'zTy)`ZA6j'uutZ_p4q99998}zC롇CZ==Pҋ'THa7?1_%i*!b +ѳY1H:ZN{Pfb4Xb }80NPj@]{us0e~q\8b4p受?]] qi_^*jNڰf;z7kF.ݢnA{a/#pI^"`1}9N9:00_r:E SJ6H{6V~e̹ᰵ5!_b]c+L[;m +x`o
5X|J8; +=GB6ɀ)lxC,i`RZӾeO פ;]{]7
5 -&}#tOvc&a#2ހgHcK;gF-TEg8lXK$X9;/=bN
N
NujvՅT [LAć#Hw;`[7t?nA/<Q}a7bN/vjYć08r +1sG91'Z!t+l`ikkk^QP*5!P˲_,\-gƎ)$˦Ni]/
d4X> /MN.Ν-v ){ضe[=25>*AƐhnY+?8BL(斷gWku
C<2 {u]孙lۊݐᚁ9Xg!;s`t!B@F'#H$K/uFK0j&({ޗR !+[0 +c +M¦Aa{ ?lEƄ1N8@SSTEH0/Թ+-rKUx{VN^q[GSo|깻o?uTg +XX +<t8̡XHw.8{lbHMʗ9uА"HA~XA36(3"ϐŵ,.%BQF#FL,8RlnEFx^gr +Z^alV<qpDDQ +zHZ87њīn?MR@8j9ViVtKqY.! +hEj5.Z6nu5,)hqqgBFՑ_]A|+\"r3Ml~l*h]DG0ޠv\!a~]D|",s7MfJZJMiJ>f.U2..⏿tWĪ)?jOtc4_|~+Pfp|&0jlMVfr@8aq*~^W<3րU98E{GW(QU0Q^xCLq#> +:FpK.Yt +Lf,]Y?{pFL$lso6RV,)[?f2RsmϞfz^c^MLOp'Z:VʞS5U\ +vP\3G&AK{IFs$ϸ"1wQ)i@Ϥv[%ȐGR=A$&g^xƮC!x`pc(ک)0%e1 +&@]PU菫؈w.C鮅Jl& S\`+YI\z|`lb{>o9_~ߩuzG>mjjŐ~_A
a#J:R HTCFc8\?ch75&0Z)l
[:y<tΥ7Y[`QoGn~lf͊eH.0wX~ُWKcl<|1Uh(JdfT #վ\^t,?g@SoV
gf,3hee4^.6ߗzX!>fh"j3h.@pGjKcX# @G4"
04o_z&kXv@OۦVqutJMciC.!HcX;%z +aϰ Gq~G9DŽlQxDg˩іZTQy6[Ѧ"u&gcoox-h=ecgU;fj\I!T'~8w\rJFXѥjnx&l;jkM,K.dLkjB
zIBKjln4+T2R
n +'#p:s(ꠃÓg3h'^}P>J( +
~T9Wo%VZGYlm'5'4. [.Cu
J0WX22o f͒ 5* +§`NtU(zIkQ&JoCU*~̑?laH<C +R]bрa1CX +9Y6k?Z6@X5nn_A ko7
<m;Ɏ m +ǫ;;?ATu&gLX"se=kXֆEUAFߨhVVK~ඦֶT +=[{j2WN :q<-~RZJc}ܬz'KoS1mMηÉ# +dv^)ܰJQJs$uZ%ee +eg6n\<sq<ƂPpmHhi& +CDPP_TzAn!ӐI ŅkbBa +0ƩSAt;S>s!'QSg:t^)߁t"=~Û:^,`&^ei;x"b^&<=HZ<'oau}w( $mA24FyM:[Ǒʃ˭ղRmɞƐl\ֶNý*x!#kV-_:C3Au&%_}*8% -Ƴ:`2t`^_^^Xu+nǦ1h
B(GwrqbO=P ie}ɑ$QRh!-ɖڳѳˆ! ++ +MD2*T"z^W$-@/P+j*eG(p|DF!+egK;Lt+J/W13pz<ףM$cW@ӪE.JoH1pC(>_VU/t/vb(6BBύ@w`ȶeG^Kl4c#cDTa0
pr7g~`UٚlJTn/(H!3 uLj<#)a +([ +Fܣ1 +sżnD᪺d]0W/+)럭ST/22?.>B\L + +h~{EJ-We7@5ЊB3ЦϮVJ65SKFsWkZ +n(`tX-1NS/mܤ>Ar/"o-o_BֲVwm|r3#c''Je6M<yW`|z^)w,GG
ߒrp4"o;FR+NxXM44 +2T>ޔe;g{z[Ml+3{$g8p}qWe\}9H=PsX6(QxCz{fzXhp+ww
jJk&YZ4_}?LF6"؎ܶgj `{?X>-װZa1L^ +|^DV4;8=g(W@.y9YXڴ*k@܊r+&/նcT+`Q&v2茸7 +Cwu#KJWOJF[T +'QOј'>"ȏk%!l y=BudlAXy-˾gO:XIT +S@|M ++)t:1%ŊLLmUd*ڛ2}eYǍÃ_yYWω}O֫NJ7#LLlNs{!uO>rѣ۪,y6PBH,Ls$XuFvcc58~|ȲQ4-U̼OQ>ʾJ:-F)W*tt>TrŃ +K|p9B) DԸ1G DCE
XhxWDc1=)|"4swMul=o,d~u7@ޟ"pλ뉪sjֶ<m5[®C.Xޞ}KØ2PP
;#]Nڰ;8qִJX~sMZ|Ǎ^tq'7b +G-|M,Y56@4Cާas"hߔԯ^R(֯}5+IװmJ7w^oy +0⽟,? c9I=U#B*x7H1/YA +q]H7ӖzDϗMD{?D!yO-zG!ĴVЭI1d~`*^sW[^hX.4+*ʾ9ҳ\EhptjoU +*?k)Z:o䈲@ԊM7{<A=thQƶz:T>m=+ +*݁8돛1f.6'Kh(2y,.L+fRu]F1O/J +~(3 +@VAew)Mx8GxTGx*ܦ«m-@ϛUjI#FjXY6 +{5t` +xW{`ԏ;ncd]gOkLȠnFP}|4 +K%+#K\L qWm495XLi\wh5gG] HU*ҒZg4f jJM ^04fKSrfw%aDm^ղjQPg($0Yr9Q 5Te Q0^If~٫~øٸ۸`$6?Ƙybm6`/30#mI=)`90F1dl +5.C)c^
k+t
*R'OI_.ƉֈCJڟ*ʞ;y}\4~} ++ZSݧ$T6ԡW
%uW]iă*rQI%^"R(À;}CSH(;']0jcduǶoy6)Ո2((uD<>4k}@EEXI d@3nc2_boB11ⱡ-Xq>+!P!3\ Kti iXmfsWW51hŠݸbh2FJOx'hr>Ao#KU9h:{ЇZLC9j8*!m4*} +mެP&0y6Q>j,:Ia]eUsWm7=xlzԮ6xo' +Hn&n7J%̶^)y'Hb2>;ek*ٲ6\6QAL*ڨLW۵& +p\.>v<1PNPkq6.8[`g$1`>IB0@[G%|EAt.~#!?Wa7hQQ8N-7Qm=^N]OJYCAi}?%Œn-);#FQ7,8K5"TExbh|Yv:qS9eiSR|e'h3G4F[>U 4 +,B㠉,b-3Fns>]@A3D.ƞEw2X?un Qe!rwYO3x.Su&yT4|%IX9Á3S3ȐZ\wG94PI(X-\RlkHZ((gd?5㋏s#[uhd0UL}FOB*U +jtHI:2L֙Ɛl==ٻ1 +ґn[kj3S,}"
jYOETc,l +Wf<ֳ<gXLs)E؊vp3^`9V4cN|,xԦ\P@>>j +`;vL:=gQ75ZzOHe,r#o|
*G,`4`69Td)f|w$&,j_R.Z- ;#cgn*g +¨x5v[k_yg٩VN%Q<C)e$L5 +WnU0À#X;i2@߿e4e2US~XʞxĿ:c?&[Z2>4e +'zHbNdX` _}*Hڤ>M/?KןxxhKH=O /(S/LS1KzWA0ysW`:!]<{$jQU|b@邹L ZLJ9A_vx#'-\1`?;bpy!Y<N +'zKFSE˞8G!.f=Li04J`5F +'
fP& +vHL5i.l˰㟁 +Xy-jE`O8j@WR˾V!mÀosVš]WA1ͼ߁!j2( +M6wB|fy3aׂ;3Ywԡ o(VJ6s럊-m@|\j4)Nr$ + +hJf0՞P5. +8 +;f+Y
N) +@+u%7AkZ61wfcIFթ7F-u 7dg"zI [Oc!_b64#Y +K/Ko~'ʵcg9l֜G#QUZ_a#@sßo{FN33gT.SI3vvQRR2qd| ӘM +fScHE&lFn +RRi8]8I~,#F6*ĭvX nFL^ZZ@Ӛ&дZ +i'%?]mA\J۴ۖP,sf$[vۇ'3sf9sYޡkg{bJZoݩS;Raw3Z\ҩfō6FCW|CPlx,Ƣ$ƪBOczV$0Id4`(F!~#\ݑD?=gӂ5,(LSQr7/lS;M~4 +<7\2ւH<K%-S\]ӻ;ӅSTnЏ䱥/{Ӳwot9e2HB#!9bNciR]å,ϑ918㞅2ĥ}X:U\Z:Zaʵ +1n5)}wy$) RYs:Mc*vy2z)H^mB+?p ˽FŘjח"a`(4VK#S(YVA0xYz6hdX,aެ\Mr,O݃;bAD
d3LTHJbho[ e@]Jc%1l)o/~CЧ +p]崌( ._I})b7mnSɂt1zQLXq:נ~_EuJ +2??'lxE໎%:-ͷ S8,r +5M +7@?&NdO\!4`W]Q*|G?V3л\_ +0兄`V"/ +|6 +1R8'/+>Zn"˄ +v|^*J¢Kh)S =<+dlHhpG+z!3FեU2# +-0(ƀo
WKzl\IAg3QnEc) +g9u6#[[e,,,9A;v>qǶ(?A$?V11#JȩG'ӤޛI7m@HJ3Ab N*d6-NRֱV~1e6r
Z"ZhUP蛤Ҁl~̄h\m[X=P1>K*IߜiCf-@(XK6us[LݗIpA)(fSH/@Z=5YvUoo96m|Avigk{&nڿt;ж#}y7mu:uJkkW-=ѱo]u7:\0:9 f +EEQr'.gE7?3HCRȭWkz&N9X)Whvj菷݇9&3s8
z +pҫ1a DLh0aELhHcB߄ W<Ԧgzjs-[kUц & +Ą?8+Sъק`>cDkҌ1Aݟf60]?F&l_\J+E?F*܀LPPHz v!Pd=\(o
0A yz)
"?E,
`T*$0 +5Nq`r^˄Qhw>8B2h3hmf +o)Ŋ7w-@<"ěDh:,1|D + + +Uݹ +nm-8!@iK +@GqZ 3 y\目0Aߣ)I2E0yQL?a0W(SH}D1RLqǷ\Cwo4Er_[S$'7|ego;{HJ>wZHZPYDk(-1B·Wzo3}Oy +%`=hjL=]Mh݆p~C +=`ЮEv巩|K~D+)l\Q
jQBe wGK;cJBY)j>LQɘO׀\QqB|4.EyR\ޅsOblhoPE%;̹n;gКoBHRY!wݱ +v +VAc(9dgX +Ȑ&2\?dÎ>m[/Ys3PgYcͯ_LkZy=o$^ՉLLȚW8oyh;ޜ[07eQ +x=ː'pز +ƂM +Ij>JO[~?WXѪ|.@C +y',xzA? +eKi~[bykX^sS`֢ݫܨ4ڒ?|[pˣ-;ז߱.i)<~{{jNeҚX%C
il>,EΩZ[\busH'H;:, +@ 7};C>R.w{wrOSk3;祇ǟrtNx2ɳRpVsI}0:I'}~bdULbQ3tߠ_ttE, +Y:Ws9M
5n; +! ~ +vXR~ 3kjX +[rx#NLsXFWdKPXC!1G0ECcw[!QKHj^ ԓBA!
Tx=ͿKNe1c%') *4VCTN_Iszj01*ǂC8-[:Pb WatBҠ?JL3#ʫ꺏tօT@alao0Ȓulclv1
6Fn fwTY?тO/;{wtXq\Vzt>Z,}߮=-GsShGՄH\yp:)\ +(h{ÜE.LAg+1~uկr1Հ6K`b0QTӥU艌qrlFiHW #aL5n KF?yYU))4
ECķdnFoѮd슫Do]1 +φ& 6<{}}t},RdƃFU +4<"II/^E 쫑E' +ZJ S@ a7@P>AD +4 r_+}iJЉXQ||N٩W<(՞2bBAo*g%4JOAF$@5l00,*Z2Y͟_ɟ`HA!:{3kpcm68[ +ؾ)R{NJVO8 ߝ/)ޑȇj&Wh䳤ܧ~[R~
{4Z=4)RcXc<y}Nl)LE˂Bͥ +Sb4߈7_$oR6gr庵oTmbePCjl~yF;t-a zRS~Ơ%|<W^<^YXʙ.JNA]F+vl9zԬFo?XFCCP;I;T=ΑıyBʾл_*PMv\5M^E=֛}ڻ7#pM^bL|U5oeѬJG. +А<^Y06Xt';fә;/yld,.Bfm_9j[%vv#[YHzrYx[wO]oRhr~ڐuhc<mӳhk jِso{/ԣ~Aޏq#xRWj1?RMDR ;PZa:,CzY Z +<NZ_nE"x_pyjٵCޖY!qLu#ޓ%!9\<ckhKMkZ9U64g4!2:@k̟z^킞)|ƯEuE9i̲Mo2J13U섑(EN&Tyns
~DheWTsPnB[\|=;BYOkC:b$k
-&ݶa8ֶSmV),8uU9 +0.H2H6")4qT?+s/Hu
&W*ߺߜFkjo3$HIQP5MAoТNߢܨS;D'qPM%q?}p6p'$d gJP#$n{1Tmґ*9Ӯn*ܥuQl\ZvVO"B``t3Muk+n ]0[\<<u=BM?ݜAm}
V(j/22è0ZM$ǕIE2_^QIs!g
T*6IUuɹfTY4W3mK7!Mf#n[Rtl$UmtGwcEp~ +P%MHrϳ7
iMhfLd6++*moTwMCMŠMX;֣qXaXaXa603=,NzoFTw^Rg$cc0P -vwInhj(MCw>t"<ƔttȱXadFx8XO|haŶVlt-(rGGBdDZ-!8tɄvaTdraCL_E^ Fǘ>aǨۑ +ٕ7/LMȘ5dED1Ɋedah H\ӊ0,>c>|>O +ID</,[}"鞰;zVQxh5~+%>>_]6PdZk|J7F +=LD?g+TFA뎃^HC~ +=)v5E`%IMɣ<V +ơdQJJ~ʩSǥQǭQ_N48NѬ,"tC-Jd6&
bqq,o%vu7n
mՏ,0/ *6[[ۺ`XX[::=v;En:0t 5WxWRۘH}v_;^yt"s6sSfBg +>7\.ş81l1\/㛵u]|(GP{P]@'+>w#ljy1[L$W$kOkmó5Ry(f1B-N3-M;s2:56͞##-t4z.gnT#dF^F#[9# ޠV<80J4ApHwSsьw~[~A^@G/r$_Bu6_%Ġ|2YCPwU,)0{N'<iW /l)l18{xU}4eSi#0SzIu9:k81AxV\yi79&_4)#Wh +iuC&^4MBwͻCc0ycuυ\?ӱ\tFN3io-Nh2yZ"ΈρӠ[*j]m.ߢ>0HN$Thz@S(w-iQh%]SMz9$@"cvDfh$3ΟFZOfF6&CHv"i"*^G^QNYӚky*0-G8Ϸ-tUs:vK̰/`ik%bOڳ6-l8X[Hwxh~w:~kT܊˺г*Qo%E@$uL[PNF. 8\9]%"@D8PFk欓-fِ6]NwR +j?}ʧf +LHd1vff%ZgԾZyID"E@ c)Lgf?9tAte0NW3t5354Ҟfm2W839 + ~&#bX6l5Y1v+9y9$5lKP"} +T3h8bwfm;<L8dlwoT{XKs]!q"*<*^f( Q7t:v`WERΩZZ<#zc +Lf@[&gkgY12FyR-9Yog
, +Z!KLguѺRYV
c%fHZ~}91l^J]4Z
:q&gN +w2ZYNjŶ]qSa +<+/LyI;X5 +.3_&yٹKh·
Fx$1!+@yveL_eN(dlq`<%ZJ[O7$vXkK}H]fQE3h$mgr{NmI;װaujRkZsQyDs"ofwv.4[6<|U?>_>H-ֵHpqBZAABZ98m܈A16,lNW`P^Hq|o\1_:srdJ\ R[?ΈACGZIW{.wQQ"J('=D2:'[Zɝ&8e[;qi?:lq +={sB0T't1YAc&W~YYˢ3= w;M$s1OxLf$'qsK!@u/mKE٠LŽ)$ZўlȬwo<j$_<qܫ-=yܳz骧h+#,᎕O#a_?S{`8 ʧbX"I ?$!Owb;zҥXO]Ş:MfTLT5Yuu9 +V4kYG,G帝V\83~_jŅE3 ^"hN>C%PɲA<{Gȥ<R= @Z:'א&Gy&x;4݇.~ZEQ/)1Ze!bv#Exh +@kg7.c,A\-1ʱU +>U?&zd]@\db7wĞAͶBo1Ló-}חw;8̭7D(\6 +5Ud.,viR +Bg +$3h8>ikkljCF6}Rd3zI|d[pƝfg m<__
8,ʵ S?vYu,q]spVZZPv6Jñލ=>f>pT%
_oY9\vuU2l6&б ]fWݨGѨm<l9@c3k +az4ʈϠÙL +'F SϨ`Nŷ6|㊖M]N-a,=Ri:Ngؽpgm<MI%0,m +hFCInNd8f
,lܯ tBu@{hN.y4Jq>1W\YyxUb|-L\h&n L;'7t8"dǺzTO[Ɠ(6uzS%b8\f{pk@.l&) (yDUPAyNW
?dw63fr3 əe'ܒpD1:T."FD0Dd|Ϙi4;KuI%Kv_Z~p+w
n\}cpɍX7۱cTt@xϓoOŞV)Y+ቶ>B,q4n˞\ \T8k BPAdQH_f3hwg-x3RUG-һm#Kpu|s`Jc5zx9:i5ى+;PeMKP9ifc_%3?g0
2Ae~F(5jQWyCڒY^?з܁)>j'[}&hY|h]>вŷ\獍l)-7(:PGnC6ulhk?Žskk:YlüEgzLk<-z[6Po&^xNF?z. DMMج\@oa#7XE3& +:"KdrNSR!Tk첆,EWm銖NJuR=hM<m;BVxmEkIjޙGU.$ aM3d!ldYLf&dfDY4b@AMVPZҚm]+wιw|yvC<{9:DLlڴ <\|n7-˸csPUMO ~1&Kزd˲ ЕBAӫtҵ9[.LhXQ[>]:+99
;X5tYE^4sƲŗNhyK>#q㹌QӣxK9fjugG4Sfd{ͩ⒉?y)Ր*_:~b:9K@m27U4{vVhVAMrv;Cuk;kO~^~i˭V/*YWV»6n_g)_j,ɞBZrϹfϴ.c;ϫ'ul2amm^3aVeI
+/0}%[MpKJ]βNȴk-Iix^Zђ>uҲڕ|Ku%Sl]vĥ3 ? +4a)
K66{r1M#֟zLcc
G+(T\?7m ӦOZw@{`ѾXR%Κ0DMxO|~p(D센8yjl?>Nv1OS)G W+10=b")d-RoLTNSD3!wC^gh{TxS&[wFI&.S'NΨʻϕ;L^?"S
&N
yɌãec4tq~qΕK:W2LgO$'=wVTSDѲpEfo"%uKV-}o٘,*s% +*eT,Wr+G^?-+_^k,㊬P)ª-)n%K^YzPvYqO~6kmd]/;+TqR9r}垤$ K|YUՓZ?Se#dxjMڛkQ7j߮ &uƤ>"q;ŏ6ͷn\uWmmr
nh8cSߵukߤoJoyrvg;?odzvyo5>Wofu`B`zু} 0x2Lׂ2\2۞ٱz;.8ɤs\knu;T{^tݛw;v{vN^מ/X^
/,\.WW]ֽ^q{]{[<$%)IIʿt@v\sw~/t웾u߳7T%%)IIJRo'$%)IIJRW=={C,8p'.7ƗVۇ6OrSR$%)IIJR$%)Iҗ +,.&) +f"a*߅KU"7G\VōQseM\ۡ\qջ岞]r E
ڻ岉)bg*c +%yN;"N"q\VōQs;&]˭x@. s岞3g!
|ut4l&L%Ser91"ǓuMHˌ3+3ά8*nʚvƙgVfYqfeƙgVNI͐.ˌ-,B. +9 +WR#Z\\;FTA:NZrh6:fj/t^e)j[L~;Zvhcy혇ppkQkA+m}zkמ&AVވjJt6:z7@[0IIhom\l"t>/庂#\\+$$[h{([ +7B!]]_YcsH^hcՉZ;J!Ae)@YY&Ŵ^"Kg }*҄m`u{kb,+j_nWfi㗭t)dF?]
-CxBĪVcy^+~͘Y>zu(F:2fqz[vshf&J5tRmrV+{2Y?ۗ +N4$>,>ټyFevAi,fJ4<4X˞N,ckg6lポ|>9+Zd%l-iAɕ蓇^G])={W|Urs˹!#=4GY;ӮD;;̙d/]'rWgӝӲSFё5*/hnOndWh#1B˕u^5*wΓ7-bO5t@6JGCItOw xO9s =f^b+{6]s@>} +\,̯Gtع)?:"JNN\c!?k{g>o6oQM<9qe-{TvS؏C +ܣ֭{EM$R0S[RwyyĝFjK>ڢ{K;Qڠu/]82IvʱG4ho+'Nq#qgGS1N[ZK唉?SΉrJ]A+^5̵gGzvEo\1JPۈӲMBAԊZL3NmP)3J7WINj0Ƚtbh#k +g<QzIy
͂lJ!3YZv)D茊e@k2O/ʨ%6ʈh&:aQ9zƸZ:Y[IP~bj9G^+Gl{!U(RjM_!~Vr
z Q;Jk)bYm9VvP%Pך(R-FgRrUv^ly/k:FϺzb1e+zH ^fl8K|domQZaZzyB(bWmtiFl/-,̗*/k +I>odxwsK((ո3'pKU~흾5;$ٲX˖jTj:|h]kJm <z|iv=<#0.n6B-.N*w;\ޠkt$Wkt9%k#9 =ƀaZ}Py MRݡ)0 +CCVu@ +s䲇pap`\v?6OJo[+AW*JAv. +:Bٽݕ#JvohÖ2 >/ XK$D]VOfbxȇ KKV6qG= +؝V{`;YҨg64;|X +攷9yEiMB\iU
N9`tgd(Fz`,{pҗ#mX +g%[reKNwf~ڱ@;N* +~(&2Ck8l;po6G +! *VPYn̂ $@"kz|vg"=;Cr}#8]ddLO$eɆi!R`rD1YF-5ڃf +ed_pys~msI-#s<l/uDIp<x`ڇ54%ŝ& ʄDRM6'Hc3[j + A 6c̈́1XaGqkD(v?U@!eyCvO"V+ʙy"'͆lG,isl݈J
?es]vRaDd$OoÂ-4`o4^bAI>eSIS#[|Fm/qQNr(j#8X̏N7
őv\/DB%sS`9] k[hLآi +m5Ru}MuUm1/ʲʒR\Q\Y#mRTR[y9Vk}U՛j֔IUEh\]lˋTXTa"[*UӻXZL0
+ʪ*2 +*jP*kꢷn,-Ζl5eHIM*}LA-%z}mq̖b[9tՒ$?H~,&?},`_ɏ5?`x @y#ď:ɏ $?&_1bǍdp.A%\z5Mi2#l))d{xo6Nk/tq?M#UZMK96+p+:$lGq7!u-#>DN{>'^'YWrJ~
x}ow;|IK
. 4=aV%9aQ(*ū:!lS WG#ϋ{ۄo +?~&-*#8$| +{Y8]8_|_?aBH܀* +f0~fYqH4YE` +l9i^c +Zl>Y cj;u
`0̎`>^ϧ0*0[f!n0}`v}̾fOl|`$L+# + +̶`v
l?f78= +f?'e0{>mM1S|K\*-*0kl?f_`#0{38fi`6Y`D̾70{~7lgY&-B0l;]fK`v=fOK`&
{_fY. +'<_ 4N_(_:UXtj{rǐN_/R'O{#JG7:!YVz{6MCo*{tjNEt+ +NUTe6댜-uKkk!RXJg35:zzZXC&ԨxO,vAtg8Щb4ކgHtIr1qD'Jlx)&z@jtSq).yv\~kx35]Fyj24pbԪ8Ykz[4jN驮${=z<^VU=Bx'z5g0q FG0T4<äq;L]]݇<ɋJ5k8A:D/VI\ GOUXg_o5*p>%EJC?,D+~NfTWQ{AXeXg64<h)ũ*ӉVة,7 +VyҎ^z^g<>rB11̴N_ԅZ +3Ӆup|iX]4HGCPqzX(;Ob#X`[Dq42*hnmO6-n
aFJ֣5r2뇫 ,LC%sG9VcX̡9Tb1Gz1G{SƜU-rUnppFz-?յ G^fM(]z7Epez3NusVz/F$
GZOO7UՐZN=k/jbzN' +lx#>4F^B$"&Yג[4A5? N~ti?RT:jx-9τ;
*Πƥ#ڝd;Б4},85o ,6!>ZqjL!nŨneZj*;}HkhezAbJ,T&HT",Nk,Y燉
:$nĭJq"*`zVְX0 ݰ*5gД /* ڳ)"oPKq+R`Le0q5DKFRjm) U*ޠ%Ǵ&DZ4,H$Zc5dmFVViiN /IJNւ`fLG|tt>3h31\j0
?Hшt҆M{V+zorv6y`
)HZa0D*%"۠
FCq
T= k-oг*ZJLAs3c|.09㈑ݒrƢ#ňj'|ڨ$4]+;SFx-v0ڙyҖcƸ,AOg'ku8˰Jָ%qqԺT_{)6E>b5Iq` +_dmnɀ"4/eZ0h{U*zV;7r +Έ&Z݉Xe/ahFe%lH+r&lgL +>9yԩ8o7#C"! G#'"&#oJ]ɣ"
k"39:4p\?YD)옖ќ08~$#vQK"c\*d67T)7Мstl:tj%WtdX2,&='̇EN1qB؎gw7ƫ_GT@E\+i +U
`pDh +Dٍ;v?ESTEkV-Į-'ӧN
7]zO{u/ثe-KҘ2h)ni2y8It<ibͧ@q,LS#vKe4d4A7N{ƔaI<Y")@yA
K"}F6|ѫ h&
jj-kjj:գ y<ӽWkx\Ff6(a`$_6%k$\Cid/
3vL>Ew\4Pvd8m9 +,x +h'K庸.1\k!tFƔ} kQ^LǸqd(M; /Ivy1u +4]t\⒁r1<r%eT}Rm.Q9ai[vpGe6ΐrW;#.'g_{nU<BY{t7i(9p&TPO6#kO(bUElqT5{Ixn/C!K("qÉ͑3k"zlB^\\wl/mzx +#bհݻpE7I*\wvX=F7$k]hzpeiCk/RLz)UlXvv!_d +=/*k@n|rJTl%T~ +tMA
PB\?Ucga*(3O=í0)PbcJ}Gj*aޗI%ϛ)smZ,PsS&~QRթ8թu}1ęׁ6n.$q];;pRVf+WrZ`.٢,Mj!k\ҽxIz6 t:vMݩ%[n@
{=~S$Td#T>r0z;Oh>R}Ihlxr3xE|lJ33#!]/g.ߨο-ZyrV/UCuucw~?k`50/Oy;_aj0"POlhp<-gc7Ud+J4:^$ۄnw4SL0J;`i\lME?A9꜔toàWلw<ṛ9sBzXv~Xz'4֤Goei\B + +VTе95"(Oa
6~VUB!oX4|Xqo;':y[1Xs@A;ǖ +T`<R& +8r?K +_kr=B0;47%TP&n1Q ֣ +B l1t +Prwd| ^T^ejY =^ӄ\긽23"egh* VWHd(Ue}2\)kٵV5tՏnyQ<͟V}ݨ%HࢳT.;1q6Aevs1$5`MRvn_e+:<Rs@U=FwwzW'tx +)0tB|+O#hfCy3[0ӌ`~AOZPNPb`,.B.NJ߁Ð`D/z>5\zKIL$N}-oi
fAOiJL-Ob^^C0L..( ~5~RϦL( +o={_\ +endstream +endobj +199 0 obj +<< +/Ordering (Identity) +/Registry (Adobe) +/Supplement 0 +>> +endobj +200 0 obj +<< +/Ascent 750 +/AvgWidth 521 +/CapHeight 750 +/Descent -250 +/Flags 32 +/FontBBox [-503 -250 1240 750] +/FontFile2 198 0 R +/FontName /BCDHEE+Calibri +/FontWeight 400 +/ItalicAngle 0 +/MaxWidth 1743 +/StemV 52 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +201 0 obj +<< +/Ordering (Identity) +/Registry (Adobe) +/Supplement 0 +>> +endobj +202 0 obj +<< +/Ascent 899 +/AvgWidth 890 +/CapHeight 771 +/Descent 205 +/Flags 32 +/FontBBox [0 205 1359 771] +/FontFile2 214 0 R +/FontName /BCDIEE+Wingdings-Regular +/FontWeight 400 +/ItalicAngle 0 +/MaxWidth 1359 +/StemV 89 +/Type /FontDescriptor +/XHeight 250 +>> +endobj +203 0 obj +<< +/A 215 0 R +/K [184 0 R 185 0 R 186 0 R] +/P 183 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +204 0 obj +<< +/A 216 0 R +/K [206 0 R] +/P 187 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +205 0 obj +<< +/A 217 0 R +/K [208 0 R] +/P 188 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +206 0 obj +<< +/K [188 0 R] +/P 204 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +207 0 obj +<< +/A 218 0 R +/K [210 0 R] +/P 189 0 R +/Pg 14 0 R +/S /L +/Type /StructElem +>> +endobj +208 0 obj +<< +/K [189 0 R] +/P 205 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +209 0 obj +<< +/A 219 0 R +/K [191 0 R 192 0 R] +/P 190 0 R +/Pg 15 0 R +/S /L +/Type /StructElem +>> +endobj +210 0 obj +<< +/K [190 0 R] +/P 207 0 R +/Pg 14 0 R +/S /LI +/Type /StructElem +>> +endobj +211 0 obj +<< +/Length 2612 +/Alternate /DeviceRGB +/Filter /FlateDecode +/N 3 +>> +stream
+xwTSϽ7" %z ;HQIP&vDF)VdTG"cEb PQDEk 5ޚYg} +E6<~&S2)212 "įl+ɘ&Y4Pޚ%ᣌ\%g|eTI +6'~khu_ +Ⱦhs2z\nLA"Sdr%,߄lt +4.0,`
3p +A1vjp +K0ށiABZyCAP8C@&*CP=#t] 4}a
+ߏƿ' Zk! $l$T4QOt"y\b)AI&NI$R$)TIj"]&=&!:dGrY@^O$ _%?P(&OJEBN9J@y@yCR
nXZOD}J}/G3ɭk{%Oחw_.'_!JQ@SVF=IEbbbb5Q%O@%!BӥyҸM:e0G7ӓ e%e[(R0`3R46i^)*n*|"fLUo՝mO0j&jajj.ϧwϝ_4갺zj=U45nɚ4ǴhZZZ^0Tf%9->ݫ=cXgN].[7A\SwBOK/X/_Q>QG[ `Aaac#*Z;8cq>[&IIMST`ϴkh&45ǢYYF֠9<|y+=X_,,S-,Y)YXmĚk]c}džjcΦ浭-v};]N"&1=xtv(}'{'IߝY)
Σ-rqr.d._xpUەZMvm=+KGǔ^WWbj>:>>>v}/avO8 +FV>2 u/_$\BCv< 5]s.,4&yUx~xw-bEDCĻHGKwFGEGME{EEKX,YFZ ={$vrK +.3\rϮ_Yq*©L_wד+]eD]cIIIOAu_䩔)3ѩiB%a+]3='/40CiU@ёL(sYfLH$%YjgGeQn~5f5wugv5k֮\۹Nw]m mHFˍenQQ`hBBQ-[lllfjۗ"^bO%ܒY}WwvwXbY^Ю]WVa[q`id2JjGէ{m>PkAma꺿g_DHGGu;776ƱqoC{P38!9<y}'ZZ։6i{L{ӝ-?|gKϑ9w~Bƅ:Wt>ҝˁ^r۽Ug9];}}_~imp㭎}]/}.{^=}^?z8hc' +O*?f`ϳgC/Oϩ+FFGGόzˌㅿ)ѫ~wgbk?Jި9mdwi獵ޫ?cǑOO?w| x&mf
+endstream +endobj +212 0 obj +<< +/BaseFont /UAQXCA+MyriadPro-Regular +/DescendantFonts [220 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 221 0 R +/Type /Font +>> +endobj +213 0 obj +<< +/Length 65922 +/BitsPerComponent 8 +/ColorSpace [/ICCBased 211 0 R] +/Filter /DCTDecode +/Height 540 +/Interpolate true +/Subtype /Image +/Type /XObject +/Width 1182 +>> +stream
+ + +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz + +$4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz +`pP㞴APEPE1QK7 +(H')9#</^sQE +1B'(=~ +9 +( +( +)h֟@R@B'j +("Ee\-PEPE48) +IɧE +*=_ 3jp ~\P +ke*) +6lb(RE +ZjlN(((KE +()%v%@{oJMܻqJhi1Ө(ٷt Ҟ^AC(`T +()ku +( +(?(h qN+[(%y1]ۜ +( +("UC1&ʻtIӊ!dv'Zec$NGt,@#PKp52i@(T1q + +12p;(J{sN +ae\q> +u +J +y97HF$r:} +( +( +z"C=M/:3$([va_wL830 pB +H>d
"9\=hj(E +;SCpzuE +B28 +r1O~uvݭ "Gfg!rrI|-|9wm).@FNrTlpqN>4PFJ;Gj(68'>v +@{R@Q@Q@惜P + +M|9SFFZiTƲ`JF=O +B)h((0J}Pij4WԔ +6u<F$c8c5ko&eaL1I<حzRn1~A}kL^ + +cAx>x](P@' +(ݎM-- +( +( +(1P$B)8'(>{4= + +,V$zRs|zI}.pr:k{AOY[셜ݘ@ܧcweˍIS+z +( +Ջ. +{Nӯ|/k$f5B6A s^ai-p' +8Hz +KWu>zP6zv=?u= +F$ <2M +( +( +(PHsN +( +cH\=Pߵ5 +( +( +( +(E +( +)r0i +=G_ +\`` + + ݐzt_ٛ:pLrw\qg +8 +)|si +Z +j:)(X0sS袀=:S +( +( +NԴ +Q,j<,v&{'خ<[wFvʖ<>3[X&A67Ic$c?~+ycH~}qO,_Gl1cc +~3Z&bPY?9\a=T9=+ޫ7Eѵ=CS?o7ڙPl+I\_Cqg2Ļ +* +( +()hJZ +XgojsIKE +L?1NÀH@XzW^$^֠nT,\{c5|F-㨭屾80n|Z嗉P]FhUP(с2P<rog\i=P{{(!""а\ +v4QE +( +NԴPEPEPEPEP(LRQ:q^yGR@W ?rJO{U({x;}֯Ɲv:6 8sg]Dɡ[\[D$Kt=f:{O5dG
n$n;HX9|K_sa +O-㞵xI4k}H]V' +q
1ؑ˫N㝤OZV|\+B+HF@c;ofߌVi,FUdn]KwIG@A;zvl˒\ +m +( +*7ʡ2qҮ'rEp +ʥ?U&sLhwW`'CO4 +*]F>S +z` +( +j''֝E +( +( +( +@sKE +z_&8fڥ"e-20@:֠)-ZxmC)yK\4"p11Sr?JZ(M+z=SDVT'=RRq + +1Ǹfc4
+( +( +(G:(5p'X9 ++?Fh~B_qۮ1__A-4'F -A9W$# :!
AK Yԫ];I }s +@6qj9_j +LR@Q@v
@MxCFz@\(k9 +ܣpd)<_o6 l_?<}%[%zʱ|3 +`k +pkڿ,ͮ}V}.T\@4k{B=G-L G +|F~-Zjow,ooR0H!' +4h~6u(@! +( +( +( +w#֥ +(E +٬hVyx`s^7^fK! +ʪqN
oYOmǴ$TrN +0pdC~T`0)W/٣/e?/3
3VA8_$w.O"3b#6G@ ?ZJ##ʡxRDtaÍ(ٵ me-K )Ԝmlw_jf[Yգ4=F0I"oY<KŖM3M +6Kc+D1\F, =? +Hx +C +( +( +(-PL)NsDv +,FeKD"3@=Z4}
a]j-w,d@'~aMAf08Ag +HG,r;N=E +AuixmWT\淖Pssa_KMY5ܣΙwXu8{Sj8Ҵ
G6̱&9`=?ּ?ktב*̩ 67 `t$:=>kb2EQ,@@ cI9}!5-:r Yx=V;iG1-ԕbIڄa\`85"d9b2{=M +re9þ!𰍭VS߸ +.Fr}YGbi4뤘! +( +wϳs?: +C;j1qGקOZ3x~2:+>kW^̈́lkn^}(ԼtxtxX bAP#_ռ\S4[p1?xg/ov@9\B5~̚ЫIo8v fg23@UM֝@Q@ zЪN#߸' + +O[Z|km]P +b=8&-֠), +oMrI +nm}LUɄTr7|p=5KƷn֬rIprG_ +AΏ6ƎM!، +]א '$tw/ēwЋ
C +G'ndhq +:J3&21־j79*v#]bXs;4io#^B-rr^H־̂xIgWNȹ arC+)T}σ(mi.)V2\z (ָ4Q@܌4 +e +z`TI u3E +7jlid207;g,zxOuc{p_eAw:hpӢU\}zn\gE< ֥yTLj؍PT) + +;GUb%QEA{ +Gi + 9G#f&\#GpsӚb'u
^}> G-S. +:M:(5@n0˞+MgG4Ǖ6E?p +y$qj*2`B8-֕֏28 ;h +-Z'I; f"̹`/#$Ҽ55}Vf9(\gf=-UZ}@!'T kn-ĖN$<0'=ը.<:7p3Hb@#$~f5)t
RCeul"\+rI*;dRIᑂH +( +( uhݏߧN?(( +(4PI8KE +qQW+/l[ǑA]'8 + +MGMGKR1Ce) +lrs_U]chb6Eɹ(:d9+A;آ-A<)"r˗0{OEPUA,/V(Mx-=ϵKQJ`8(ׄ-|m~;1PT +`gWM>h)#2@h' q +^%b +DYswҾIDY2oƍb֛ o.y':M扡[iyBdr$ +֏M6+>dgA( d`ޓŨ<a +ILPv+O|*skoٌNT~9VӓtNdmlE*J +!\+<ZjDd1. +8 +r +"8}kSiZ٦vKGln7 + +A8=k +xXϱ ̸
6鑌
u
,
Lr52a֗KLKtAA@Zda;>9?V~-o&Ą A~;zk$Q{d$ m8]2H=L5
BNoX̹S90O?^h3g.4_ +#qR[]8+P9.w#L3e=:8W^eG2p,ɒ1 A0z~L7M"C8#I2x$lg-Xpz⾭<A +( +){z&4eGuR($}X!,5Soy +CUPqzTF0o`Bnչ٦g! X 32rpq +͵u4q5I,intw2' #*Z\KGッz^]LƅuH|<#@xWXӼ?nɛ(.ۇ%N:g#h/Y,aA.Hf<qII=J·v]/GoM{wǠ$ԧH>uK)@?h#[kĻuUvp9pJ;dyk;=B35:(Yx 㸯uK\^[cb! O@={w_Z]f[hKiQb@/U݂#}?ThWImlQ;++)\dAȯuf<Mah?4M_D5j$G[!rN?1?^ٯ/ +Rgsc`pGՒU^8ԕ$ҾP_+'c<`2) +}.<Ymỻ6*VF9°遑#>ƿfe\; Q+.#\q^SfaZZl-A;7 +=n}9Eх,\gV l>A~a!w +T +G#=0|%<jxWa{Lzski8}Gy +H d̀u<p "XM&ˏ3n8<c~jtH5:5Iu@[L6 + ^ +fX +u9%-$UKH8v<]9EGCTdp987Կg/><jbd +u-:楱].G5Lɇ~}G +NT߃
Gu;cH%w !q:Wt?6T + +Lap3QHr +0gӞh1zmﭚ!,nۀ8'<d}kjO + +3;sw ++ɒ +Ir<OJ +9pI:^Eo'U +n@Vڭ9<]X2F1gJ +?QxRZn{, +In sOL`P_xj-kڏoiyVy['Nkٓᗈ>oZ.!x& +hP@N9{oR$xv +G8 +̖t1\RA9W +2cIQ@2XC
7ln'=:q~7_n4aL:}ko]7xjދ}X +x#$)U8-獅XBQ?J洝CZ`!ӵ+VXGJB69#2j]FCe铴rZ2[2(v`YpH#+/ VYad!cTyG99=SOOBa-&h'rb +7E|]Μd*ŗw# + +|vF%<O_xP,H"F OR0FOi~ |ggskuR8F +'`6zP6=F}x%bIfT>?ᗁl)=K*bc'83c'&@sK@VbR +`sAT +Z +,}ps0=(w.v7Yv$cbk"l7n"@&P#=3_X@?\or@ S>f?U + +AKE +2@ +[;{@Vj +>2OZҚFF4E~ξ*ݕaafCh~vVzgY&9ʄ=(n +p[i#88~y/l 'Z +vemḺ'<U((((&BxYO0A?UַF@#9q뚱ޡ062p}(j)di +n--KE +/!&:22ɯ ovͺn/!WϓCd+EqE1F离jܾƁQPm +~Kqፚ\H`8Od䌜WDѫ'Ҁ?'<O_Ne-
9ԐTz +S qkS_;6լ⸍l8 r<u<Z˘' + + +( +*<1`Au% +% +Gt3K bC0:u +Z +j[1,YUX,Ar +?fKZ^*,J*
s@ ȯ! qL*@88MYm(Z( +( +(n +9 +*V`q9OʮPEPEPEPE01ot +ʬrӭ} +]GtF]IⴿxՉT7 }GL( +(t +( +(=N +NPEPEPMfUn;S(((ʬ[xQ@H1(7{ԜRQX_ +ǭKUQ), 4Cn`dtC!\5Ԁ> +)35n$ 1@QE +t=jJ9 +SAҀ=o>ڶw\$LdWĽoZ4cV` +( +( +( +( +)" +k0PXT3ES%s~t33H#5vqN( +BW-%(B|~AX[jzj$qހ)iN(o6㚒 +:QE +w
II +(RGz +C959bag +^B
xAk;pd- + +@Q@Q@Q@3sd$N_vG +E + ++* +(#(d|Av=]N*J2 AuNkvTh\_ +( +)~PEPM #Ҡi,;xac>4 +( +CqKE +t:W +O> +x4dg#o֧%aE>P9 +9q@M{zSr8!ԁJ:R@Q@
y)Q@Q@Q@Q@Q@4өh64(((u +Z +( +)`: +( +( +(#7zT +Zit[/#Ig + ɑG瓟ҤbAP;w8FbH['Ҁ's:OU.m-8I +80Ak?_u_z$9\.6gy<Nk>[KXmGq6HR'VH/!$' +el _ĺgror, S #$@`եY[h܁` +( +( +(2R3 +FCKak8<r$O=MZ >RrCOOś{[hao"GRFldK=O:AfG 1 kce;hs$)pͿf@!NA CamtԞ[b""^@cvm +( +( +( +( +@sA +(?((RE +nI8$O˜V)@9M: +(H##- +( +( +*$$mcT +v}p+NjtmfC +UHsАk摦C;~'g?1Tlq +( +( +( +( +(8돥 +( +( +( +( +( +) u +((h *rzqM9PEPG9 +( +A3KM +ϵ. owQr@$=rzV^64"d|+oN@#PWōwۙ#bN\#ڼWPOEz +r +( +*6# +(( +( +( +( +( +( +*!"L]
?K@Q@R`@
PG֟E +( +(QE +(=8lqޝQ!ރ<J( +E +( +(+(Qݾӏ<S?LT0(_3ܟV( +( +16g>((#Q@Q@( +( +( +(?
+endstream +endobj +214 0 obj +<< +/Length 6918 +/Filter /FlateDecode +/Length1 14180 +>> +stream
+x;tǵ3V⿍`1X6N+imm,i!G
i܆~6 I!Ik8iB{i{ھ4ѓ6Ρӗ3+`rrN^w;3wB2kzu\G`ZO@ +~.&cyDO=P̭iYvdփ6` /? h-_ 2)/#ĽW=gwـ4E$_w~DykR@>*"tUfH
Gfڐ~HC`)̧oGߎf^k˟=oջVǏ7Mڟ>UtOo:fR|@+M q&1c<ctHr(9heh82#+M"//fĕ-\ŋOZcNYBc5hsZ%:tEr^q{_<S'ie(+@<ip)TJ
JtYʱtS;p^,r!!\^.>93E[7P)ڥZr5l^P_WQ|YҊ%6qW/).*,͙f,faw
¾qc5%R"uƉMK0]ӕ9*!vw |>I +ovc +! +0KN%VѺzZb-X9lk5jZ&+g(wsݽqwevz8}uq}=uK+~&1?wgId'3wSdV'Z +nd*TɭmS>ùʿm>?Ln
z_&5@a>FЧ݁ +BnwhZLiitw;͝kf +w| sut̝D?%!-+ē\b?C/ + +<{эfZni>0:AOc.GA;q ow>{ | +f3.o^~'/<ݼO?lh:lz536ǩ,,҄a7kP1 +Eb(5B+=
iҔ4-݁o^/wD<xM<Iq?MN^\ 5zOCݦh'=|:æ3|z=./$=?-Ą
>On-D_`EE8pYYkgEQ0i/wFTFh1 G~#Bp@]c[jg9's&ڷ]Wېk-hj/+ΑZ6Ϝ1O_
=4Yiy%6{[ƷjKߗ[|\*nr .eiaE3g.)_fiBbYedaunN\qp[qtdsjj%gܼbe08IG[\qK]m1EP+⦆BPTHGM+*싅fټ_.ss3*1&Njuʦ,yY掬VoXUP?4o4
<֛*ҹ[gǪnN87'U~U23-ed,%z?ذNVmGУkq+Jvvً֘'eλ6
%^}z.G;/Xغ|Rۚ}=%]٣%K%tM'
U;'[@I+nq9SM<nK+.h\'ւ`),(.* }1`51E
TuЇiz.,tDصܰ˄9 cwx¢k9^x
>Wpn UnC[T\;V`zUC_
ZEWgL}<fimgVXvMRo5Emcv|ֽ*+_g'<Gg[hDU"wjF˖-wԚy(3liUM]}ÊƦ-m,ܺ,+.ߗW$ВYKWf4V/[^նjgd5pwe,7f#R]xہҜtP@"c3jq0Z) +9/g]%
bɛ,!i%67 +q
M4f +*7@NQZBJ6dCQ(ThH(+,GDuPTLKH=#@Rq`
J
ʄWBYñpD0Ue2SҤO +'(̤~yw$8'*ЙG U"[&s7LdϰK +FIeJ HCwY[3~0xC
<bMC:(j/
)@<CŢTD; +VɜaI
"j!c79Ȫ L +%(5bl# Rb7rY/Ř*i'Ԭ%a'ʯx ai`%ف3Dp*$ZbPD/)I #2QIī?[N38*# + Q/@D^xk~ +p (upENW[ |QhC
Ɔ´'C+x{s;0[=H#tRj
+ L{L"«S2U.}ETZԦc#uT,N!JQz 8s)]*T"0F9jyD|0ht̋tU +1F,ۥg=,(5#ܔ_?MYKVd6;>chq.ͅu&0DF:Qgŝ+$V-N&C)Cv%[Rs~CVDnZ5n~j~v9K}VR!:-e5oĚgj#Nvw9~A_
N5E?Aݒv\_#_htD +ᾟ&$iJ?~NBb2yE$ $.ڒtT" +endstream +endobj +215 0 obj +<< +/ListNumbering /Square +/O /List +>> +endobj +216 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +217 0 obj +<< +/ListNumbering /Decimal +/O /List +>> +endobj +218 0 obj +<< +/ListNumbering /LowerAlpha +/O /List +>> +endobj +219 0 obj +<< +/ListNumbering /LowerAlpha +/O /List +>> +endobj +220 0 obj +<< +/BaseFont /UAQXCA+MyriadPro-Regular +/CIDSystemInfo 222 0 R +/DW 1000 +/FontDescriptor 223 0 R +/Subtype /CIDFontType0 +/Type /Font +/W [425 [658] +] +>> +endobj +221 0 obj +<< +/Length 231 +/Filter /FlateDecode +>> +stream
+H\j0~ +Cq21aXpl%3,QC~:?[Ҽ4'8-B'Uy.v4QieJ86UU?E/;^+;dOnvc)Au
{ftݧ ̿kܗalp8Ec
BUVHAߨ߆]]OWNPvf<y9C֣~ +endstream +endobj +222 0 obj +<< +/Ordering (Identity) +/Registry (Adobe) +/Supplement 0 +>> +endobj +223 0 obj +<< +/Ascent 952 +/CIDSet 224 0 R +/CapHeight 674 +/Descent -250 +/Flags 4 +/FontBBox [-157 -250 1126 952] +/FontFamily (Myriad Pro) +/FontFile3 225 0 R +/FontName /UAQXCA+MyriadPro-Regular +/FontStretch /Normal +/FontWeight 400 +/ItalicAngle 0 +/StemV 88 +/Type /FontDescriptor +/XHeight 484 +>> +endobj +224 0 obj +<< +/Length 15 +/Filter /FlateDecode +>> +stream
+Hj` 8 +endstream +endobj +225 0 obj +<< +/Length 520 +/Filter /FlateDecode +/Subtype /CIDFontType0C +>> +stream
+H|OhAgjv5bA]R{1?J5`,j,Kek0MRW#DA APEBj($"^>}= 2 +endstream +endobj +226 0 obj +<< +/Length 597 +/ID [<20356CAF1EA8E546BE7E22ACA2CA4797> <A6C79E772A68E946B1318464DC3158E1>] +/Info 8 0 R +/Root 1 0 R +/Type /XRef +/Size 227 +/Index [0 226] +/W [1 3 0] +/Filter /FlateDecode +>> +stream
+x
]hu9f;i624Z1@g۳gE7V,<laJ
*Th<:^n뺯w_!@~%OKujV$<*$ۄ';ByT* ϔ6K(!<_PRcPlmr
viû[u
j>NCK9= GKqnƙ=c/_uG}}ګZt:S+5 +mоKe=g=g=w:tD?|M_kvCjwгQ|MizSN?B_2/~?U\t ~}8aw~çdwuF5QgNk8i78Ym^fo'9Ήω
#SĦ??[Ɖ=;mYb{fB̽Z&v3Z$va%vmV~&voT~"lP/o_^zktQDo}E(RZ2m!M$Ud2I_)kj[e$%GnT'ڡ.r]#]iЙ
+endstream +endobj +startxref +360498 +%%EOF diff --git a/Semestr 2/topo/FraMalCzęść1.pdf b/Semestr 2/topo/FraMalCzęść1.pdf Binary files differnew file mode 100644 index 0000000..1be118c --- /dev/null +++ b/Semestr 2/topo/FraMalCzęść1.pdf diff --git a/Semestr 2/topo/FraMalCzęść2.pdf b/Semestr 2/topo/FraMalCzęść2.pdf Binary files differnew file mode 100644 index 0000000..4b52abf --- /dev/null +++ b/Semestr 2/topo/FraMalCzęść2.pdf diff --git a/Semestr 2/topo/Topologia2_Franciszek_Malinka.pdf b/Semestr 2/topo/Topologia2_Franciszek_Malinka.pdf Binary files differnew file mode 100644 index 0000000..299d001 --- /dev/null +++ b/Semestr 2/topo/Topologia2_Franciszek_Malinka.pdf diff --git a/Semestr 2/topo/zad1a.jpg b/Semestr 2/topo/zad1a.jpg Binary files differnew file mode 100644 index 0000000..062fa49 --- /dev/null +++ b/Semestr 2/topo/zad1a.jpg diff --git a/Semestr 2/topo/zad1aa.jpg b/Semestr 2/topo/zad1aa.jpg Binary files differnew file mode 100644 index 0000000..7a56efb --- /dev/null +++ b/Semestr 2/topo/zad1aa.jpg diff --git a/Semestr 2/topo/zad1b.jpg b/Semestr 2/topo/zad1b.jpg Binary files differnew file mode 100644 index 0000000..6cc23fa --- /dev/null +++ b/Semestr 2/topo/zad1b.jpg diff --git a/Semestr 2/topo/zad1c.jpg b/Semestr 2/topo/zad1c.jpg Binary files differnew file mode 100644 index 0000000..62722b9 --- /dev/null +++ b/Semestr 2/topo/zad1c.jpg diff --git a/Semestr 2/topo/zad2a.jpg b/Semestr 2/topo/zad2a.jpg Binary files differnew file mode 100644 index 0000000..d3c8cd4 --- /dev/null +++ b/Semestr 2/topo/zad2a.jpg diff --git a/Semestr 2/topo/zad2bc.jpg b/Semestr 2/topo/zad2bc.jpg Binary files differnew file mode 100644 index 0000000..1feefd1 --- /dev/null +++ b/Semestr 2/topo/zad2bc.jpg diff --git a/Semestr 2/topo/zad2da.jpg b/Semestr 2/topo/zad2da.jpg Binary files differnew file mode 100644 index 0000000..fad050d --- /dev/null +++ b/Semestr 2/topo/zad2da.jpg diff --git a/Semestr 2/topo/zad2db.jpg b/Semestr 2/topo/zad2db.jpg Binary files differnew file mode 100644 index 0000000..ca8122c --- /dev/null +++ b/Semestr 2/topo/zad2db.jpg diff --git a/Semestr 2/topo/zad2dc.jpg b/Semestr 2/topo/zad2dc.jpg Binary files differnew file mode 100644 index 0000000..bd8ee14 --- /dev/null +++ b/Semestr 2/topo/zad2dc.jpg diff --git a/Semestr 2/topo/zad2dd.jpg b/Semestr 2/topo/zad2dd.jpg Binary files differnew file mode 100644 index 0000000..709e10c --- /dev/null +++ b/Semestr 2/topo/zad2dd.jpg |