Válogatási listák
Keresse meg a lista maximális és minimális elemét
A hossz meghatározása
A listában szereplő elemek száma kiszámítható a rekurzív predikátumok count_list1 és count_list2 segítségével. Állítmány count_list1 nyilvántartja az elemek száma a listában az egyenes során rekurzió, a listából vezetője, ahol az első paraméter egy aktuális típus byte számláló, és a második - vissza kell adnia az eredményt a kimeneti a rekurziót. A gráf predikátum count_list2 számolja a rekurzió fordított irányú listájában szereplő elemek számát, kezdve az utolsó elemgel, a byte paraméter pedig az aktuális számláló és az eredmény egyidejűleg. A probléma megoldásának két változata a 39. példa.
39. példa: A lista hossza meghatározása.
count_list1 ([_ | T], N, M): - N1 = N + 1, számlista1 (T, N1, M).
count_list1 ([_ | T], N): - count_list1 (T, N1), N = N1 + 1.
Keresse meg a maximális vagy minimális elemet a listában a max_list és a min_list rekurzív predikátumok segítségével. Állítmány max_list keresi a maximális elemet a listában, hogy közvetlen a pálya rekurzió, kezdve lista élére, az első típusú paramétert egész jelenlegi csúcs, és a második - vissza kell vinni az eredményt a kimeneti a rekurziót. Predikátum min_list keresse meg a minimális eleme a lista a visszatérő löketének rekurzió, kezdve az utolsó elem, ahol a egész szám paraméter típus egy aktuális minimális és az eredményt egyszerre. A probléma megoldásának két változata a 40. példában található.
40. példa: Keresse meg a maximális m minimális elemet a listában.
max_list (lista, egész, egész)
max_list ([H | T], N, M): - H> N, max_list (T, H, M).
max_list ([H | T], N, M): - H<=N, max_list(T,N,M).
min_list ([H | T], M): - min_list (T, M1), H> M1, M = H.
min_list ([H | T], M): - min_list (T, M1), H<=M1, M=M1.
A rendezés a listaelemek egy meghatározott módon történő átrendezése. A rendezés célja, hogy egyszerűsítse a szükséges elemekhez való hozzáférést. A listák rendezéséhez általában három módszert használnak:
Ezen módszerek kombinációit is használhatja.
Az első válogatási módszer a listaelemek átrendezése, amíg megrendelésre nem kerül. A második eljárást úgy hajtjuk végre, hogy az elemeket ismételten behelyezzük a listába, amíg a megrendelés meg nem történik. A harmadik módszer a többszörös mintavételezést és a listaelemek mozgatását jelenti.
A második módszer, a beillesztés módja különösen alkalmas a Prolog végrehajtására.
39. példa: Listák rendezése permutáció módszerrel (buborék).
40. példa: A listák rendezése beillesztéssel.
insert_sort (lista, lista)
beillesztés (egész, lista, lista)
asc_order (egész, egész)
insert_sort ([H1 | T1], L2): - insert_sort (T1, T2),
beillesztés (X, [H1 | T1], [H1 | T2]): - asc_order (X, H1).
beillesztés (X, L1, [X | L1]).
asc_order (X, Y): - X> Y.
insert_sort ([4, 7, 3, 9], L).
Az első szabály teljesítéséhez mindkét lista üres legyen. Ahhoz, hogy ezt az állapotot, a második szabály lép fel insert_sort predikátum rekurzív hívás, az érték H1 folyamán kezdi eredeti listaelemeken, majd behelyezzük a verem. Ennek eredményeképpen a forrás listák üresek lesznek és az első szabály szerint a kimeneti lista is üres lesz.
Az első szabály sikeres befejezése után a Prolog megkísérli végrehajtani a második betűs predikátumot, amelynek hívása a második szabály testében található. A H1 változó először a kötegből vett első értéket 9-re állítja, és a predikátum a formanyomtatványt (9, [], [9]) veszi fel.
Mivel a második szabály most teljesül, a rekurzió egy lépését a insert_sort predikátumban adja vissza. A kötegből kivonjuk a 3-at, és a predikátum asc_order-t a harmadik szabály nevezi, vagyis megkíséreljük az ötödik asc_order szabály (3, 9) kielégítését: - 3> 9. Mivel a szabály nem sikerül, a sikertelen és megszűnik a harmadik szabály, ezért általában udovletvoryaetsyachetvertoe 3 helyezünk a kimenet a bal oldali listából a 9. betét (3, [9], [3, 9]).
Ezután visszatér a insert_sort predikátumhoz. amely a következő formában jelenik meg: insert_sort ([3, 9], [3, 9]).
A következő lépésben rekursiiiz verem 7 eltávolítjuk, és a harmadik szabály nevezzük predikátum asc_order asc_order (7, 3): - 7> 3. Mivel a szabály sikerül, a 3 elem be van húzva a verem és helyezze vyzvaetsja rekurzívan újra, de a farok a lista - [9]: beszúrni (7, [9], _). Minthogy általában asc_order (7, 9): - 7> 9 sikertelen, a negyedik szabály hajtódik végre, a feldolgozás visszatér az előző lépéseket rekurzió első betét, majd insert_sort.
Ennek eredményeként a 7-et a kimeneti listába helyezzük a 3. és 9. elem között. (7, [3, 9], [3, 7, 9]).
Amikor visszatérnek egy további lépésben a köteget eltávolítjuk rekursiiiz 4, és a harmadik szabály nevezzük predikátum asc_order asc_order (4, 3): - 4> 3. Mivel a szabály sikerül, a tag 3 be van húzva a verem és helyezze vyzvaetsja rekurzívan újra, de egy listát farok - [7, 9]: betét (4, [7, 9] _). Mivel a szabály asc_order (4, 7): - 4> 7 sikertelen, a negyedik szabály végrehajtásra kerül, visszatér az előző rekurzív lépésekhez az első beszúrni, majd a insert_sort parancsot.
Ennek eredményeként 4 a 3 és 7 elemek kimeneti listájába kerül:
(4, [3, 7, 9], [3, 4, 7, 9]).
insert_sort [4, 7, 3, 9], [3, 4, 7, 9]).