Listen in Prolog
1. Allgemeines
SWI-Prolog Listenmanipulation Teil 1 (library lists)
SWI-Prolog Listenmanipulation Teil 2 (built in)
Eine Liste in Prolog (engl. List) ist eine Liste aus Elementen z.B. [a,b,c,d,e].
Eine Liste besteht aus einem Kopfelement K und dem Rest R [K | R]. -> K = a, R = [b,c,d,e]
Eine Menge (egl. Set) ist eine Liste mit einzigartigen Elementen. Die Elemente kommen jeweils nur einmal in der Liste vor.
SwiPrologListenPraedikate Prädikate zum manipulieren von Listen in SWI-Prolog
2. Sortieren
Liste sortieren (sort entfernt Duplikate, msort nicht)
msort([e, i, a, c, g, h, f, b, d ],A).
3. Umkehren
Liste umkehren
reverse([a,b,c], L).
4. Ausgabe
Die Elemente zeilenweise ausgeben
gib_aus([]).
gib_aus([H|T]):-writeln(H), gib_aus(T).
gib_aus([H|T]):-writeln(H), gib_aus(T).
Die Elemente zeilenweise, rückwärts ausgeben
gib_ausr([]).
gib_ausr([H|T]):-gib_ausr(T), writeln(H).
gib_ausr([H|T]):-gib_ausr(T), writeln(H).
Liste rückwärts ausgeben
5. Zusammenführen
append([a,b],[c,d],L).
Nachbildung von append
append2([],L,L).
append2([H|T],L,[H|M]):-append2(T,L,M).
?- append2([a,b,c],[d,e,f],L).
L = [a, b, c, d, e, f].
append2([H|T],L,[H|M]):-append2(T,L,M).
?- append2([a,b,c],[d,e,f],L).
L = [a, b, c, d, e, f].
6. Trennen
trennen(Lin,N,L1,L2):-append(L1,L2,Lin),length(L1,N),!.
?- trennen([a,b,c,d,e,f,g,h],5,L1,L2).
L1 = [a, b, c, d, e],
L2 = [f, g, h].
?- trennen([a,b,c,d,e,f,g,h],5,L1,L2).
L1 = [a, b, c, d, e],
L2 = [f, g, h].
7. Löschen
7.1delete
7.2nur ein Element entfernen
Entfernt nur ein Element
Zusatz für entferne, wenn entferne nicht Scheitern soll, wenn Element nicht vorhanden.
entferne(E, [E|R], R).
entferne(E, [K|R], [K|R2]):-entferne(E,R,R2),!.
entferne(E, [K|R], [K|R2]):-entferne(E,R,R2),!.
Zusatz für entferne, wenn entferne nicht Scheitern soll, wenn Element nicht vorhanden.
entferne(_,[],[]).
7.3entferne_alle
Entfernt alle Element unter Verwendung entferne
Identisch mit delete von SWI-Prolog
Tests
Identisch mit delete von SWI-Prolog
entferne_alle(E, Lin, Lin):-not(entferne(E,Lin,_)).
entferne_alle(E, Lin, Lout):-entferne(E,Lin,Lzw), entferne_alle(E, Lzw, Lout).
entferne_alle(E, Lin, Lout):-entferne(E,Lin,Lzw), entferne_alle(E, Lzw, Lout).
Tests
?- entferne_alle(l,[h,a,l,l,o],L),!.
L = [h, a, o].
?- entferne(l,[h,a,l,l,o],L),!.
L = [h, a, l, o].
L = [h, a, o].
?- entferne(l,[h,a,l,l,o],L),!.
L = [h, a, l, o].
7.4Mehrere Elemente gleichzeitig löschen
delete_list_all(Liste1, Liste2, Liste3).
Alle Elemente aus Liste1 in Liste2 löschen und in Liste3 ausgeben.
Alle Elemente aus Liste1 in Liste2 löschen und in Liste3 ausgeben.
delete_list_all([],Liste,Liste).
delete_list_all([H|T],Liste,Restliste):-delete_all(H,Liste,RestlisteTemp), delete_list_all(T,RestlisteTemp,Restliste).
?- delete_list_all([3,4,5],[1,1,2,2,3,3,4],X).
X = [1, 1, 2, 2] ;
delete_list_all([H|T],Liste,Restliste):-delete_all(H,Liste,RestlisteTemp), delete_list_all(T,RestlisteTemp,Restliste).
?- delete_list_all([3,4,5],[1,1,2,2,3,3,4],X).
X = [1, 1, 2, 2] ;
8. Länge
length([a,b,c], N).
Nachbildung von length
9. Findall
findall(+Variable, +Ausdruck, +Liste)
Lege alle Variablen für die der Ausdruck gilt in der Liste ab.
10. List Memebers
10.1member
Member of a list. Wahr, wenn Elem in der Liste vorhanden.
member(Elem, List).
Gib die Liste aus
10.2in_liste
Nachbildung des Prädikats member
in_liste(Elem,[Elem|_]).
in_liste(Elem,[_|Tail]):-in_liste(Elem,Tail).
in_liste(Elem,[_|Tail]):-in_liste(Elem,Tail).
10.3first
first_elem(First,[First|_]).
10.4last
last_elem(Last,[Last]).
last_elem(Last,[_|Tail]):-last_elem(Last,Tail).
last_elem(Last,[_|Tail]):-last_elem(Last,Tail).
10.5Get element by index
Zugriff auf Element mit Index N, startend bei 1
?- gebi([a,b,c,d],3,E).
E = c
E = c
10.6mem
mem ( Struktur,Zugriffspfad,Teilstruktur)
gebi([K|_],1,K).
gebi([_|R],N,E):-M is N-1, gebi(R,M,E).
mem(Struktur,[],Struktur).
mem(Struktur,[H|T],Teilstruktur):-gebi(Struktur,H,StrukturTemp),mem(StrukturTemp,T,Teilstruktur).
gebi([_|R],N,E):-M is N-1, gebi(R,M,E).
mem(Struktur,[],Struktur).
mem(Struktur,[H|T],Teilstruktur):-gebi(Struktur,H,StrukturTemp),mem(StrukturTemp,T,Teilstruktur).
Test
?- mem ([a,[1,2,[x,y,z],[s,t,u,v,w],3],b,c], [2,3], X).
X = [x,y,z]
?- mem ([a,[1,2,[x,y,z],[s,t,u,v,w],3],b,c], [2,4,3], X).
X = u
X = [x,y,z]
?- mem ([a,[1,2,[x,y,z],[s,t,u,v,w],3],b,c], [2,4,3], X).
X = u
11. Permutation
Eine Liste mit Variablen (Lv) wird mit den Werten aus der Liste Le belegt.
permutation(+Lv, +Le).
12. Extremwerte
Extremum innerhalb einer Liste (Skript S. 37) mittels Rekursion
maximum([K],K).
maximum([K|R],K):-maximum(R,M),K>M,!.
maximum([_|R],M):-maximum(R,M).
maximum([K|R],K):-maximum(R,M),K>M,!.
maximum([_|R],M):-maximum(R,M).
minimum([K],K).
minimum([K|R],K):-minimum(R,M),K<M,!.
minimum([_|R],M):-minimum(R,M).
minimum([K|R],K):-minimum(R,M),K<M,!.
minimum([_|R],M):-minimum(R,M).
Mittels Sortieren
max(Liste, Maximum) :-
sort(Liste, SortierteListe),
reverse(SortierteListe, [Maximum|_]).
sort(Liste, SortierteListe),
reverse(SortierteListe, [Maximum|_]).
min(Liste, Minimum):-sort(Liste, [Minimum|_]).