name = 'shiftleft/2' slug = 'Premakni elemente seznama za eno mesto v levo' description = '''\
shiftleft(L1, L2)
: elemente v seznamu L1
za eno mesto premaknemo v levo ("circular shift").
?- shiftleft([1,2,3,4,5], X). X = [2,3,4,5,1].''' plan = ['''\
V seznamu vzamem prvi element (recimu mu H
) in ga dodam preostanku (recimu mu T
)
na konec. Preprosto! Saj se še spomniš od prejšnjič kako vzameš zadnji element seznamu? Dodajanje je ista
operacija, samo v drugo smer ;)
Seznam dolžine ena je videti kot vzorec [X]
. To bi znalo priti prav, kakor tudi predikat
conc/3
.
Če je podani seznam L
sestavljen iz glave H
in repa T
in če H
dodamo na konec T
, potem je rezultat seznam L
premaknjen v levo.
Operator ==
je strožji od operatorja =
v smislu, da je za slednjega dovolj,
da elementa lahko naredi enaka (unifikacija). Morda z uporabo =
narediš predikat
shiftleft/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 (=)?
''', '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).
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?
''', 'conc_arg_not_list': '''\Vsi trije argumenti predikata conc/3
morajo biti seznami. Si prepričan,
da si ga tako uporabil?
Si pravilno povezal vse spremenljivke? Zgleda namreč, da vračaš kar poljuben rezultat (spremenljivko brez določene vrednosti). Opozorila "singleton variables" večinoma ni pametno ignorirati.
''', 'tail_must_be_list': '''\Rep seznama mora vedno biti seznam in ne element!
''', }