# coding=utf-8 name = 'memb/2' slug = 'Preveri (poišči), če je dani element v seznamu' description = '''\

memb(E, L): E je element seznama L.

?- memb(X, [1,2,3]).
  X = 1 ;
  X = 2 ;
  X = 3.
?- memb(1, [3,2,X]).
  X = 1.
''' plan = ['''\

Kje se lahko skriva iskani element X? Spomni se, da ima seznam dva dela, glavo in rep. Torej sta možnosti dve! ;)

''', '''\

Na seznam v prologu lahko gledamo kot na vrsto ljudi, ki vstopajo na avtobus. Šofer vidi samo prvega, ostali so skriti v repu seznama. Torej je iskani element X lahko prvi v vrsti ali pa...

''', '''\

Prvi element v seznamu enostavno "preiščemo". Kako pa pridem do preostalih? Prvega odstranim in ponovim iskanje z manjšim seznamom. Če je [H|T] cel seznam, je T seznam brez prvega elementa. Ker je nov seznam manjši, sem tudi problem zmanjšal.

'''] hint = { 'eq_instead_of_equ': '''\

Operator == je strožji od operatorja = v smislu, da je za slednjega dovolj, da elementa lahko naredi enaka (unifikacija). Morda z uporabo = narediš predikat member/2 delujoč tudi v kakšni drugi smeri.

''', 'eq_instead_of_equ_markup': '''\

Morda bi bil bolj primeren operator za unifikacijo (=)?

''', 'base_case': '''\

Si pomislil na robni pogoj? Kaj je najbolj enostaven primer, ko je element v seznamu? Do katerega elementa najlažje prideš?

''', 'predicate_always_false': '''\

Vse kaže, da tvoj predikat vedno vrne "false". Si mu dal pravilno ime, si se morda pri imenu zatipkal?

Če je ime pravilno, se morda splača preveriti tudi, če se nisi zatipkal kje drugje, je morda kakšna pika namesto vejice ali obratno, morda kakšna spremenljivka z malo začetnico?

Možno je seveda tudi, da so tvoji pogoji prestrogi ali celo nemogoči (kot bi bila npr. zahteva, da je X hkrati starš in sestra od Y ali kaj podobnega).

''', 'timeout': '''\

Je morda na delu potencialno neskončna rekurzija? Kako se bo ustavila?

Morda pa je kriv tudi manjkajoč, neustrezen ali preprosto nekompatibilen (s splošnim primerom) robni pogoj?

''', 'final_hint': '''\

Predikat member/2 se da uporabljati še za marsikaj drugega kot samo za preverjanje, če je nek element v seznamu! Pravzaprav ga bomo večinoma uporabljali v "obratni" smeri kot "vrni mi nek element X, ki je v seznamu L. V bistvu si spisal generator elementov iz seznama."

Poskusi prolog vprašati tole:

?- memb(Coin, [1,2,5,10,20,50,100,200]).

ali pa tole:

?- memb(Operator, [+, -, *, /]).

''', }