Keresés listákban (a select/3 és member/2 eljárások)

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.5.3
  • fóliák: I.126-128

Egy listában azt jelenti a keresés, hogy meg tudjuk mondani: egy adott elem benne van-e a listában. A member/2 eljárás van a segítségünkre. member(Elem, Lista): igaz, ha Elem Listában van.

member(Elem, [Elem|_]).
member(Elem, [_|Farok]) :-
	member(Elem, Farok).

Tehát Elem tagja a listának, ha a feje, vagy szerepel a farkában.
A member felhasználási lehetőségei:

  • eldöntendő kérdés: egy egy bizonyos elem szerepel-e a listában
  • egy lista eleminek felsorolása
  • listák közös eleminek felsorolása (metszet):
	  | ?- member(X, [1,2,3]), member(X, [5,4,3,2,3]).
	  
  • egy értéket egy nyílt végű lista elemévé tesz, végtelen választás!

select(Elem, Lista, Marad): egy listából kivesz egy elemet. Marad az Elem kivételével kapott lista.

select(Elem, [Elem|Marad], Marad).
select(Elem, [X|Lista], [X|MaradF]) :-
	select(Elem, Lista, MaradF).

Ha az első elemet akarjuk elhagyni, akkor az első klóz dolgozik, ha nem az elsőt, akkor azt változatlanul hagyjuk, és a lista farkára hívjuk meg a selectet.