- 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