PLO-LAB
10
-
listy
otwarte
-
listy
różnicowe
Listy
otwarte
Reprezentacja:
-
lista
pusta: Zmienna
-
lista
niepusta: [E1, ..., En | Zmienna]
Możemy
dodać elementy do listy otwartej nie potrzebując innej zmiennej do zachowywania
wyniku, bo zmienna występująca w liście otwartej będzie ukonkretniona aby
reprezentować dodane elementy.
Dodanie
elementu do listy:
dodaj(Elem, Lista) :- var(Lista), !, Lista = [Elem | _ ].
dodaj(Elem, [ _ | Lista]) :- dodaj(Elem, Lista).
Testujmy
ten predykat, np. poleceniem:
:- dodaj(1, L), dodaj(2, L), dodaj(3, L),
dodaj(4, L).
Zadania
Zdefiniuj
następujące predykaty:
1)
scal(L1,
L2)
scalanie list: L1 = konkatenacja L1 i L2
2)
domknij(L)
zamknięcie listy otwartej L (żeby stała się zwykłą listą)
3)
Drzewa
otwarte reprezentujemy w podobny sposób.
Zdefiniuj predykat dodajBST(E, Drzewo), który dodaje
element E do drzewa otwartego Drzewo.
Listy
różnicowe
Zauważmy,
że aby dodać element do listy otwartej, nadal musimy przejść przez całą listę
aby złapać zmienną występującą na końcu listy. Idea list różnicowych polega na
tym, że tę zmienną jawnie pamiętamy na zewnątrz.
Czyli,
lista różnicowa = lista otwarta + zmienna (koniec listy).
Reprezentacja:
-
lista
pusta: Zmienna -- Zmienna gdzie -- jest deklarowany jako operator i
zauważmy, że ta sama zmienna występuje 2 razy
-
lista
niepusta: [E1, ..., En | Zmienna] -- Zmienna
Zadania
1)
Zdefiniuj
następujące predykaty dla list różnicowych
dodaj(E, Lista, NowaLista)
scal(L1, L2, Wynik)
domknij(L, wynik)
2)
flatten(L,
W)
3)
qsort(L,
W)