A vágó használata: első megoldásra való szűkítés (memberchk/2)

A VIK Wikiből
A lap korábbi változatát látod, amilyen (vitalap) 2012. október 21., 20:09-kor történt szerkesztése után volt. (Új oldal, tartalma: „{{GlobalTemplate|Infoalap|PrologElm14}} * fejezetek: 4.1.3 P4 példa * fóliák: II.23-25 Használata: * behelyettesítést nem okozó, eldöntendő kérdés esetén …”)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
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: 4.1.3 P4 példa
  • fóliák: II.23-25

Használata:

  • behelyettesítést nem okozó, eldöntendő kérdés esetén (eljáráshívás csupa bemenő paraméterrel)
  • optimalizálásra
  • végtelen sok választási pontot hagyó eljárások hasznosítására
van_elég_hosszú_út(N, A, B, Min) :-
	útvonal(N, A, B, Hossz), Hossz >= Min, !.

Nincs értelme többszörös választ adni vagy várni.

kezdethossz(L, H) :-
	L = [E|_], append(Ek, Farok, L),
	\+ Farok = [E|_], !,
	length(Ek, H).

Itt az optimalizálás a lényeg: ha egyszer talált egy különböző elemet, ne menjen végig a lista további elemein (vörös vágó). A member, ha ellenőrzésre használjuk, végtelen sok megoldást ad:

| ?- member(2, L).
L = [2|_A] ? ;
L = [_A,2|_B] ? ;
L = [_A,_B,2|_C] ? ;
L = [_A,_B,_C,2|_D] ? ;
L = [_A,_B,_C,_D,2|_E] ? ;
L = [_A,_B,_C,_D,_E,2|_F] ?
yes

Ezért használhatjuk a memberchk/2 eljárást:

memberchk(E, L) :-
	member(E, L), !.
| ?- memberchk(2, L).
L = [2|_A] ? ;
no

Eldöntendő kérdésekben nem keresi végig a lista maradékát, miután megtalálta.