# coding=utf-8 name = 'palindrome/1' slug = 'Preveri, če elementi seznama tvorijo palindrom' description = '''\

palindrome(L): Elementi seznama L se preberejo v istem vrstnem redu z začetka in s konca seznama.

?- palindrome([1,2,3,2,1]).
  true.
?- palindrome([1,2,3]).
  false.
''' plan = ['''\

Palindrom je seznam (ok, beseda), ki se od spredaj in od zadaj bere enako. Perica reže raci reP. ;)

''', '''\

Problem, kot vedno, želim zmanjšati. Odsekam glavo in zadnji element, če sta enaka, grem rekurzivno naprej.

''', '''\

Če je glava H seznama L enaka njegovemu zadnjemu elementu in če je preostanek (vmesni del) palindrom, potem je tudi celoten seznam L palindrom.

'''] 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 memb/2 delujoč tudi v kakšni drugi smeri.

Seveda pa lahko nalogo rešiš brez obeh omenjenih operatorjev, spomni se, da lahko unifikacijo narediš implicitno že kar v argumentih predikata (glavi stavka).

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

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

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

Si pomislil na robni pogoj? Kateri seznam predstavlja najkrajši možen palindrom?

''', '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 N enako kot N + 1 ali kaj podobno logično zlobnega).

''', '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?

''', '[X,X]_instead_of_[]_base_case': '''\

Vsekakor je [X,X] povsem dober robni pogoj, a ne pokrije posebnega primera, ko je vhod kar prazen seznam. To je seveda stvar definicije, a da bomo imeli vsi enake rešitve, prosim, popravi.

''', 'one_base_case_missing': '''\

Jemlješ po dva elementa stran ob vsakem prehodu rekurzije? Kako se to zaključi? Liho, sodo? ;)

Poskusi naslednja dva primera, eden bo lepo deloval, drugi ne. V čem je razlika?

?- palindrome([a,b,b,a]).

?- palindrome([l,e,v,e,l]).

''', 'arbitrary_base_case': '''\

Pazi _ ni enako kot [_]. Prvo predstavlja poljubno spremenljivko, drugo seznam z enim poljubnim elementom.

''', 'last_used': '''\

Predikat last/2 je tukaj štorast, ker pusti zadnji element v seznamu.

''', 'final_hint_1': '''\

Zanimivost: veš, da bi to nalogo lahko rešil tudi s samo enim klicem? Kaj se zgodi, če palindrom... khm, obrneš? ;)

''', 'final_hint_2': '''\

Rešitev lahko še dodatno skrajšaš. Kako se lahko znebiš operatorja = (==) oziroma ga narediš implicitnega?

''', }