From df9d00a9cb2f8a14c971c44cb0d05454a6281d61 Mon Sep 17 00:00:00 2001
From: Aleksander Sadikov Precej klasična rekurzivna rešitev, za glavo seznama poskrbiš ti sam, za rep pa poskrbi rekurzija. Sta pa dve veji,
+seveda, ker je glava seznama lahko večja ali manjša od pivota. Sprehodi se po seznamu in trenutno glavo ob sestopanju iz rekurzije vrži ali v seznam z večjimi ali
+pa v seznam z manjšimi elementi. Če je glava Operator Si pomislil na robni pogoj? Kaj je najbolj enostaven primer, ko je element v seznamu?
-Do katerega elementa najlažje prideš? Si pomislil na robni pogoj? Kateri seznam lahko razdelim praktično brez dela?H
seznama L
manjša ali enaka pivotu P
in če predpostavimo, da
+rekurzija vrne pravilno razdeljene elemenente repa T
med seznama SmallerElems
in
+GreaterElems
in če vstavimo H
na začetek seznama SmallerElems
, potem smo
+pravilno razdelili vse elemente seznama L
na manjše in večje. Podobno velja za drugo možnost, ko je
+glava seznama H
večja od pivota P
.==
je strožji od operatorja =
v smislu, da je za slednjega dovolj,
@@ -23,8 +37,7 @@ implicitno že kar v argumentih predikata (glavi stavka).
Vse kaže, da tvoj predikat vedno vrne false
. Si mu dal pravilno ime, si se morda pri imenu zatipkal?
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).
X
hkrati večji in manjši od Y
ali kaj podobno logično sumljivega).
''',
'timeout': '''\
@@ -45,31 +58,46 @@ da je X
hkrati starš in sestra od Y
ali kaj podobno z
''',
'>_and_<_mixed_up': '''\
->_and_<_mixed_up
+Si zamešal pogoja? V seznamu manjših elementov so pristali večji in obratno. Tudi meni je to uspelo! ;)
+?- pivoting(4, [1,4,5,8,6,4,2], SmallerElems, GreaterElems).
duplicates_not_considered
+Si pozabil, da je lahko kakšen element v seznamu tudi enak pivotu? Kam ga daš v tem primeru? Ta hip nikamor, +zato je prologov vesel (in žal logičen) odgovor seveda... da, uganil si, "false"!
''', 'all_elements_in_either_S_or_G': '''\ -all_elements_in_either_S_or_G
+Kako to, da prav vsi elementi seznama pristanejo ali med večjimi ali med manjšimi elementi? +Napačen pogoj ali morda copy/paste napaka?
''', 'arbitrary_solution': '''\ -arbitrary_solution
+To je pa zlobna napaka. Za en seznam, ki ga vračaš, si lepo poskrbel, za drugega pa nisi. Če recimo glavo
+H
vstaviš v seznam manjših elementov [H|SmallerElems]
je to v redu, a ne pozabi povedati
+še kaj je s seznamom večjih elementov (pa četudi je povsem enak kot ga vrne rekurzija).
unprotected_branch
+Si "zaščitil" (s pogojem) obe možnosti (veji)? Pazi, če ena nima pogoja, bo prva rešitev verjetno pravilna, vendar +pa bodo možne še druge rešitve, ki ne bodo. Podpičje pomeni logični OR in ne logični XOR. Kar pomeni, da lahko prolog +poišče alternative v drugi veji, čeprav je pogoj v prvi veji izpolnjen! Zato sta potrebna oba pogoja.
+Poskusi spodnje vprašanje in zahtevaj več rešitev.
+?- pivoting(4, [1,4,5,8,6,4,2], SmallerElems, GreaterElems).
forcing_result_onto_recursion
+ 'forcing_result_onto_recursion': ''' +Ne vsiljuj rekurziji kaj naj vrne, prepusti se ji. To je tisti del, ko narediš predpostavko, +če je ta izpolnjena, potem bo tvoje pravilo delovalo za večji primer.
+Je tvoj rekurzivni klic oblike pivoting(P, T, [H|SmallerElems], GreaterElems)
? S tem vsiljuješ rekurziji
+da mora H
, ki je sploh ne pozna, ker si jo ravnokar vzel stran! To moraš
+narediti ti z rezultatom, ki ti ga rekurzija vrne. Skratka, element H
vstavi izven rekurzivnega klica.
no_recursion_in_one_branch
+To je precej tipična napaka pri uporabi podpičja. Preberi vsak ALI blok zase! Se ti ne zdi, da si v enem bloku, +največkrat drugem, pozabil nekaj? Morda rekurzijo? Ne pozabi: oba bloka sta med seboj neodvisna! Ali se izvede eno +ali pa drugo, ne bo se nikoli oboje hkrati! In rezultati se med vejami ne prenašajo, spomni se na doseg spremenljivk +v prologu.
''', - } diff --git a/prolog/problems/sorting/sins_3/sl.py b/prolog/problems/sorting/sins_3/sl.py index 3f96dff..4f3920a 100644 --- a/prolog/problems/sorting/sins_3/sl.py +++ b/prolog/problems/sorting/sins_3/sl.py @@ -49,7 +49,7 @@ implicitno že kar v argumentih predikata (glavi stavka).Č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).
X
hkrati večji in manjši od Y
ali kaj podobno logično sumljivega).
''',
'timeout': '''\
@@ -87,6 +87,8 @@ nov največji element? Poskusi spodnji klic.
Si "zaščitil" (s pogojem) obe možnosti (veji)? Pazi, če ena nima pogoja, bo prva rešitev verjetno pravilna, vendar pa bodo možne še druge rešitve, ki ne bodo. Podpičje pomeni logični OR in ne logični XOR. Kar pomeni, da lahko prolog poišče alternative v drugi veji, čeprav je pogoj v prvi veji izpolnjen! Zato sta potrebna oba pogoja.
+Poskusi spodnje vprašanje in zahtevaj več rešitev.
+?- sins(3, [1,2,4,5,6], L).