=====Listen in Prolog===== ==a==Allgemeines==a== [[http://gollem.science.uva.nl/SWI-Prolog/Manual/lists.html SWI-Prolog Listenmanipulation Teil 1 (library lists)]] [[http://gollem.science.uva.nl/SWI-Prolog/Manual/builtinlist.html 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]] ==a==Sortieren==a== Liste sortieren (sort entfernt Duplikate, msort nicht) %%(prolog) msort([e, i, a, c, g, h, f, b, d ],A). %% ==a==Umkehren==a== Liste umkehren %%(prolog) reverse([a,b,c], L). %% ==a==Ausgabe==a== Die Elemente zeilenweise ausgeben %%(prolog) gib_aus([]). gib_aus([H|T]):-writeln(H), gib_aus(T). %% Die Elemente zeilenweise, rückwärts ausgeben %%(prolog) gib_ausr([]). gib_ausr([H|T]):-gib_ausr(T), writeln(H). %% Liste rückwärts ausgeben %%(prolog) gib_aus([ ]):-nl. gib_aus([H|T]):-gib_aus(T),write(H). %% ==a==Zusammenführen==a== %%(prolog) append([a,b],[c,d],L). %% Nachbildung von append %%(prolog) 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]. %% ==a==Trennen==a== %%(prolog) 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]. %% ==a==Löschen==a== =a=delete=a= Entfernt alle Elemente aus List1 %%(prolog) delete(+List1, ?Elem, ?List2) %% =a=nur ein Element entfernen=a= Entfernt nur ein Element %%(prolog) entferne(E, [E|R], R). entferne(E, [K|R], [K|R2]):-entferne(E,R,R2),!. %% Zusatz für entferne, wenn entferne nicht Scheitern soll, wenn Element nicht vorhanden. %%(prolog) entferne(_,[],[]). %% =a=entferne_alle=a= Entfernt alle Element unter Verwendung entferne Identisch mit delete von SWI-Prolog %%(prolog) entferne_alle(E, Lin, Lin):-not(entferne(E,Lin,_)). entferne_alle(E, Lin, Lout):-entferne(E,Lin,Lzw), entferne_alle(E, Lzw, Lout). %% Tests %%(prolog) ?- 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]. %% =a=Mehrere Elemente gleichzeitig löschen=a= delete_list_all(Liste1, Liste2, Liste3). Alle Elemente aus Liste1 in Liste2 löschen und in Liste3 ausgeben. %%(prolog) 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] ; %% ==a==Länge==a== %%(prolog) length([a,b,c], N). %% Nachbildung von length %%(prolog) length2([], 0). length2([_|T], L):-length2(T, La), L is La + 1. %% ==a==Findall==a== findall(+Variable, +Ausdruck, +Liste) Lege alle Variablen für die der Ausdruck gilt in der Liste ab. %%(prolog) zahl(1). zahl(3). zahl(7). ?- findall(N, zahl(N), L). L = [1, 3, 7]. %% ==a==List Memebers==a== =a=member=a= Member of a list. Wahr, wenn Elem in der Liste vorhanden. %%(prolog) member(Elem, List). %% Gib die Liste aus %%(prolog) ?- member(Elem, [1, a, [x,y] ]). Elem = 1 ; Elem = a ; Elem = [x, y] ; fail. %% =a=in_liste=a= Nachbildung des Prädikats member %%(prolog) in_liste(Elem,[Elem|_]). in_liste(Elem,[_|Tail]):-in_liste(Elem,Tail). %% =a=first=a= %%(prolog) first_elem(First,[First|_]). %% =a=last=a= %%(prolog) last_elem(Last,[Last]). last_elem(Last,[_|Tail]):-last_elem(Last,Tail). %% =a=Get element by index=a= Zugriff auf Element mit Index N, startend bei 1 %%(prolog) gebi([K|_],1,K). gebi([_|R],N,E):-M is N-1, gebi(R,M,E). %% %%(prolog) ?- gebi([a,b,c,d],3,E). E = c %% =a=mem=a= mem ( Struktur,Zugriffspfad,Teilstruktur) %%(prolog) 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). %% Test %%(prolog) ?- 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 %% ==a==Permutation==a== Eine Liste mit Variablen (Lv) wird mit den Werten aus der Liste Le belegt. permutation(+Lv, +Le). %%(prolog) permu(A,B,C):-permutation([A,B,C,_], [a,b,c,d]). run:-permu(A,B,C), write(A), write(B), write(C). %% ==a==Extremwerte==a== Extremum innerhalb einer Liste (Skript S. 37) mittels Rekursion %%(prolog) maximum([K],K). maximum([K|R],K):-maximum(R,M),K>M,!. maximum([_|R],M):-maximum(R,M). %% %%(prolog) minimum([K],K). minimum([K|R],K):-minimum(R,M),K