name = 'is_sorted/1' slug = 'Preveri, če so elementi seznama naraščajoče urejeni' description = '''\

is_sorted(L): elementi v seznamu L morajo biti urejeni v naraščajočem vrstnem redu.

?- is_sorted([2,3,6,8,12]).
  true.
?- is_sorted([2,3,1,6,5]).
  false.
''' plan = ['''\

Kot vedno, poskusi prevesti na manjši problem. Naredi ustrezno primerjavo na začetku seznama, rep pa prepusti rekurziji.

''', '''\

Saj znaš dostopati do prvih dveh elementov seznama, kajne? Aritmetične operatorje za primerjanje pa smo spoznali v prejšnjem sklopu.

''', '''\

Če je podani seznam L sestavljen iz glav H1 in H2 ter repa T in predpostavimo, da je rep T z drugo glavo vred urejen ter nadalje velja, da je H1 manjši ali enak H2, potem je celoten seznam L urejen.

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

Operator == je strožji od operatorja = v smislu, da je za slednjega dovolj, da elementa lahko naredi enaka (unifikacija).

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 eden izmed najkrajših urejenih seznamov?

''', '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 X hkrati večji in manjši od Y ali kaj podobno logično sumljivega).

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

''', '[]_base_case_missing': '''\

Da bo rešitev popolna, morda dodatno poskrbiš še za poseben primer, to je prazen seznam. A ob tem ne poruši prejšnjih rešitev.

''', 'duplicates_fail': '''\

Si morda pozabil, da so v seznamu lahko tudi duplikati? Tudi spodnji seznam je urejen!

?- is_sorted([25,25,25,25]).

''', 'H1_instead_of_H2_sent_into_recursion': '''\

Si morda v rekurzijo poslal napačno izmed obeh "glav" seznama?

''', 'base_case_at_len_1_missing': '''\

Splošni (rekurzivni) primer pri tej nalogi zahteva dva elementa, pa četudi enega daš potem nazaj, ko rep pošlješ v rekurzijo. Kaj pa se zgodi, ko ti ostane samo en element v seznamu? Premisli, to bo verjetno glavni robni pogoj!

''', 'both_heads_omitted_from_recursion': '''\

Jemlješ po dva elementa iz seznama preden greš v rekurzijo? Poskušaš malce prihraniti pri primerjavah, kajne? ;) Ampak žal to ne gre! Od spodnjih dveh primerov eden deluje pravilno in eden ne, ugotovi v čem je razlika.

?- is_sorted([1,3,14,16,24,25]).

?- is_sorted([24,25,14,16,1,3]).

''', 'min_used': '''\

Poskusi rešiti nalogo brez uporabe predikata min/2. Tvoja rešitev naj ima časovno zahtevnost O(n). Z uporabo min/2 je le-ta tipično O(n*n).

''', }