Listák összefűzése és szétszedése (az append/3 eljárás többirányú használata)

A VIK Wikiből

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


  • fejezetek: 3.3.2, 3.5.5

3.3.2 append/3

% append(L1, L2, L3): Az L3 lista az L1 és L2 listák elemeinek
% egymás után fűzésével áll elő.
append([], L, L).
append([X|L1], L2, [X|L3]) :-
	 append(L1, L2, L3).

Az első klóz a rekurzió leállítását végzi: üres lista az L-hoz fűzve magát az L listát adja. Ha nem üres az első lista akkor az L3-hoz hozzáfűzzük az L1 lista fejét, majd rekurzívan meghívjuk az appendet az L1 lista farkával és az L2-vel. Az eljárás jobbrekurzív, saját magát csak a törzs utolsó hívásaként hívja vissza, ezáltal csökken a memórai és időigénye. Az append futása az első lista hosszával arányos.

3.5.5 Listák szétbontása, variációk appendre

append/3 szétszedő üzemmódban. KÉP4

Három lista összefűzése:

Vezessük vissza két append/3-ra úgy hogy az argumetumok közül az első és a harmadik közül legalább egyike zárt végű lista.

% L1, L2 és L3 összefűzése L123, ahol vagy L1 és L2 vagy L123 adott (zárt végű).
append2(L1, L2, L3, L123):-
	 append(L1, L23, L123), 
	 append(L2, L3, L23).

Listából lekérdezi a párban álló elemeket:

% párban(Lista, Elem): A Lista számlistának Elem olyan
% eleme, amelyet egy vele megegyező részlista követ.
párban(L, E):-
	 append(_, [E,E|_], L).

Dadogó

% D olyan nem üres részlistája L-nek, melyet egy vele megegyező részlista követ.
Dadogó(L, D):-
	 append(_, Farok, L),
	 D=[_|_],
	 append(D, Vég, Farok),
	 append(_, D, Vég).