name = 'sublist/2' slug = 'Generiraj vse podsezname danega seznama' description = '''\
sublist(L, SL)
: SL
je podseznam seznama
L
. Predikat naj vrne vse možne podsezname, enega po enega;
odgovori se lahko tudi podvajajo.
?- sublist([1,2,3], X). X = [] ; X = [1] ; X = [1,2] ; X = [1,2,3] ; X = [2] ; X = [2,3] ; X = [3].''' plan = ['''\
Najprej se spomnimo, da naloga zahteva podsezname, ne podmnožice. Razlika je v tem, da so v podseznamu elementi originalnega seznama, ki pa se "držijo skupaj", torej niso kar poljubni elementi iz originalnega seznama. Morda poiščeš nek vzorec? In s katerim predikatom iščeš vzorce? To gotovo že veš. ;)
''', '''\Seveda, vzorce lahko poiščeš s predikatom conc/3
. Morda celo rekurzija tokrat ni potrebna? Je to
mogoče v Prologu? :)
No, kakšen bi bil lahko vzorec? Hja, en kos originalnega seznama! Predstavljaj si, da je originalni seznam cev, ki jo hočeš skrajšati (čisto kot v oni češki risanki "A je to!"). Malo jo boš skrajšal z leve, malo z desne in... in tisto kar ostane je podseznam! Originalnemu seznamu malo odsekaš spredaj in malo zadaj.
'''] 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, ko je element v seznamu? Do katerega elementa najlažje prideš?
''', '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 starš in sestra od Y
ali kaj podobno 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?
''', }