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

A VIK Wikiből
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

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.