- Republika WWW
Transkrypt
- Republika WWW
Ćwiczenie nr 6 Zmienne wielopolowe, szablony, odczyt i zapis faktów do pliku 1. Zmienne wielopolowe Zmienne wielopolowe zapisujemy w następujący sposób: $?nazwa_zmiennej Zmienne wielopolowe odpowiadają listom w języku LISP. Zmienne te mogą reprezentować np. liczby zespolone lub wektory. Funkcje obsługujące zmienne wielopolowe (create$ a b cd) – tworzy jedną wartość wielopolową łącząc dowolną liczbę pól, np.: polecenie: (create$ a b cd) wynik: (a b cd) polecenie: (create$ (+ 2 3)(* 2 4)(- 8 6)(/ 6 2)) wynik: (5 8 2 3) (nth$ ...) – wybiera z wartości wielopolowej pole o podanym numerze. Jej składnia jest następująca: (nth$ <liczba_calkowita> <wyrażenie_wielopolowe>), np.: polecenie: (nth$ 3 (create$ 10 20 30 50)) wynik: 30 polecenie: (nth$ 2 (create$ Ala ma kota)) wynik: ma (delete$ ...) – usuwa określony podzbiór elementów z wartości wielopolowej, np.: polecenie: (delete$ (create$ raz dwa trzy cztery) 2 3) wynik: (raz cztery) polecenie: (delete$ (create$ raz dwa trzy cztery) 3 3) wynik: (raz dwa cztery) (explode$ ...) – przekształca łańcuch w wartość wielopolową, np.: polecenie: (explode$ „ab CD ef 25”) wynik: (ab CD ef 25) (implode$ ...) – przekształca wyrażenie wielopolowe w łańcuch, np.: polecenie: (implode$ (create$ ab bc cd)) wynik: “ab bc cd” (subseq$ …) – wydziela podwyrażenie wielopolowe z wyrażenia wielopolowego, np.: polecenie: (subseq$ (create$ ab bc cd ef) 2 3) wynik: (bc cd) 1 (replace$ …) – zamienia jedno lub więcej pól wartości wielopolowej na podane wartości jedno- lub wielopolowe, np.: polecenie: (replace$ (create$ a b c) 2 3 y x) wynik: (a y x) polecenie: (replace$ (create$ a b c) 2 2 (create$ 33 xyz)) wynik: (a 33 xyz c) (insert$ …) – włącza szereg jedno- lub wielopolowych wartości w określonym miejscu do wyrażenia wielopolowego, np.: polecenie: (insert$ (create$ a b c) 2 xy) wynik: (a xy b c) polecenie: (insert$ (create$ a b c) 4 (create$ x y z)) wynik: (a b c x y z) (first$ ...) – zwraca pierwsze pole wartości wielopolowej jako wartość wielopolową (w nawiasach), np.: polecenie: (first$ (create$ a b c)) wynik: (a) (rest$ …) – zwraca wartość wielopolową bez pierwszego elementu, np.: polecenie: (rest$ (create$ a b c d e)) wynik: (b c d e) (length$ …) – zwraca liczbę pól zmiennej wielopolowej, np.: polecenie: (length$ (create$ ab bc cd def)) wynik: 4 2. Szablony Szablon jest grupą powiązanych ze sobą danych (faktów), w formie podobnej do rekordu w Pascalu lub struktury w języku C/C++. Szablon może być traktowany jako złożony fakt, który może mieć wiele pól o ściśle określonych typach. Szablon oraz jego pola (zwane także slotami) mają swoje nazwy. Nazwa pola jest także nazywana atrybutem. Przykłady: a) (deftemplate osoba (slot imie (default ?DERIVE)) (slot nazwisko (default ?DERIVE)) (slot wiek (range 18 70)(default 23)) (multislot adres) (slot zawod)) (defrule R1 (initial-fact) => (assert (osoba))) 2 b) (deftemplate osoba (slot imie (default ?DERIVE)) (slot nazwisko (default ?DERIVE)) (slot wiek (range 18 70)(default 23)) (multislot adres) (slot zawod)) (defrule R1 (initial-fact) => (assert (osoba (imie Jan)(nazwisko Nowak)(wiek 34)(adres Koszalin Kaszubska 5)(zawod nil)))) (defrule R2 (osoba (imie ?imie)(nazwisko ?nazwisko)(wiek ?wiek)(zawod ?zawod)) => (printout t "Kandydat na stanowisko : " ?imie " " ?nazwisko ", " ?wiek " lat, zawod : " ?zawod crlf)) 3. Odczyt/zapis faktów z/do pliku Aby zapisać fakty do pliku należy wydać polecenie: (save-facts „nazwa_pliku.rozszerzenie”) np.: (save-facts „fakty.dat”) Aby odczytać fakty z pliku należy wydać polecenie: (load-facts „nazwa_pliku.rozszerzenie”) np.: (load-facts „fakty.dat”) Przykład: a) (deftemplate osoba (slot imie (default ?DERIVE)) (slot nazwisko (default ?DERIVE)) (slot wiek (range 18 70)(default 23)) (multislot adres) (slot zawod)) (defrule R1 (initial-fact) => (load-facts "dane.dat") (printout t "Podaj imie:") (bind ?imie (read)) 3 (printout t "Podaj nazwisko:") (bind ?nazwisko (read)) (printout t "Podaj wiek:") (bind ?wiek (read)) (printout t "Podaj ulice:") (bind ?ulica (read)) (printout t "Podaj numer domu:") (bind ?nr_domu (read)) (printout t "Podaj numer lokalu:") (bind ?nr_lokalu (read)) (printout t "Podaj zawod:") (bind ?zawod (read)) (bind $?adres (create$ ?ulica ?nr_domu ?nr_lokalu)) (assert (osoba (imie ?imie)(nazwisko ?nazwisko)(wiek ?wiek)(adres $?adres)(zawod ?zawod))) (save-facts "dane.dat") ) Zadania do wykonania: 1. Program z powyższego przykładu zabezpieczyć w taki sposób, aby niemożliwe było: - wpisywanie nazwisk dłuższych niż 30 znaków - wpisywanie imion dłuższych niż 20 znaków - wprowadzenie ujemnego wieku lub wieku większego od 130 - wprowadzenie nazwy ulicy dłuższej niż 30 znaków 2. Napisać program, wczytujący określony łańcuch, a następnie wyświetlający go w formie: „-„ Np.: po podaniu „Ala ma kota” na ekranie powinniśmy otrzymać „--- -- ----„ Uwaga!!! Aby wprowadzić łańcuch należy: - gdy używamy funkcji (read) wpisać go w cudzysłowach - gdy używamy funkcji (readline) nie należy używać cudzysłowów Wykorzystać operacje na zmiennych wielopolowych takie jak: explode$, length$, nth$ wykorzystać również pętlę loop-for-count i instrukcje str-length. 3. Napisać program, wczytujący 1 wyraz. Następnie tworzący jego zakodowaną postać i proszący użytkownika o podanie litery, odkrywając daną literę w przypadku wystąpienia jej w podanym wyrazie. Np. podajemy wyraz: „mata” Program wyświetla wówczas jego zakodowaną postać „----„ i prosi o podanie litery. W przypadku gdy podamy „a”, na ekranie pojawi się „-a-a”. Podajemy następną literę i postępujemy podobnie, aż wyraz zostanie w całości odkryty, co jest równoważne z zakończeniem działania programu. 4