name = 'evenlen/1 + oddlen/1' slug = 'Brez aritmetike preveri, če je seznam sode ali lihe dolžine' description = '''\

evenlen(L): seznam L ima sodo število elementov.
oddlen(L): seznam L ima liho število elementov.

?- oddlen([1,2,3,4,5]).
  true.
?- oddlen([1,2,3,4]).
  false.
?- evenlen([1,2,3,4]).
  true.
''' plan = ['''\

To nalogo se da reševati kot dve ločeni, a podobni, nalogi ali pa kot eno, prepletajočo se, nalogo. Druga verzija je verjetno bolj zanimiva.

''', '''\

Prepletanje tu pomeni, da ena naloga kliče drugo in obratno. Sodo. Liho. Sodo. Liho.

''', '''\

Če je rep (seznam brez ene glave) sode dolžine, potem je celoten seznam lihe dolžine. In obratno.

'''] 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? Kaj je najbolj enostaven primer, ki ga lahko trivialno rešiš?

''', 'extra_base_case': '''\

Rešitve se ti podvajajo. Zadosti je le en robni pogoj; ne potrebuješ enega za evenlen/1 in enega za oddlen/1.

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

Zgleda da sprejmeš kar poljuben rezultat (spremenljivko brez določene vrednosti). To gotovo ne bo v redu.

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

''', 'arithmetics_used': '''\

Pri tej nalogi si ne pomagaj z aritmetiko oz. računanjem dolžine seznama. Rešiti se da brez tega in tudi veliko bolj poučno je.

''', 'odd_and_even_mixed_up': '''\

Si morda pomešal sode in lihe dolžine? Nič je sodo (even), ena je liho (odd), dva je... ;)

''', 'recursive_case': '''\

Robni primer deluje. Kaj pa rekurzivni, splošni, primer?

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

''', }