summaryrefslogtreecommitdiff
path: root/prolog/problems
diff options
context:
space:
mode:
authorAleksander Sadikov <aleksander.sadikov@fri.uni-lj.si>2016-03-30 17:30:08 +0200
committerAleksander Sadikov <aleksander.sadikov@fri.uni-lj.si>2016-03-30 17:30:08 +0200
commitdf9d00a9cb2f8a14c971c44cb0d05454a6281d61 (patch)
tree098b3e7f6d5ca7e8eb29b991d7ae74d40fef12cf /prolog/problems
parent356195ee77fdbebcca310e3a9250a61c4f117941 (diff)
Hints and plans for pivoting/4 added.
Diffstat (limited to 'prolog/problems')
-rw-r--r--prolog/problems/sorting/pivoting_4/sl.py54
-rw-r--r--prolog/problems/sorting/sins_3/sl.py4
2 files changed, 44 insertions, 14 deletions
diff --git a/prolog/problems/sorting/pivoting_4/sl.py b/prolog/problems/sorting/pivoting_4/sl.py
index c173dbc..191c823 100644
--- a/prolog/problems/sorting/pivoting_4/sl.py
+++ b/prolog/problems/sorting/pivoting_4/sl.py
@@ -10,6 +10,20 @@ description = '''\
S = [1,4,4,2], G = [5,8,6].
</pre>'''
+plan = ['''\
+<p>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.</p>
+''', '''\
+<p>Sprehodi se po seznamu in trenutno glavo <em>ob sestopanju</em> iz rekurzije vrži ali v seznam z večjimi ali
+pa v seznam z manjšimi elementi.</p>
+''', '''\
+<p>Če je glava <code>H</code> seznama <code>L</code> manjša ali enaka pivotu <code>P</code> in če predpostavimo, da
+rekurzija vrne pravilno razdeljene elemenente repa <code>T</code> med seznama <code>SmallerElems</code> in
+<code>GreaterElems</code> in če vstavimo <code>H</code> na začetek seznama <code>SmallerElems</code>, potem smo
+pravilno razdelili vse elemente seznama <code>L</code> na manjše in večje. Podobno velja za drugo možnost, ko je
+glava seznama <code>H</code> večja od pivota <code>P</code>.</p>
+''']
+
hint = {
'eq_instead_of_equ': '''\
<p>Operator <code>==</code> je strožji od operatorja <code>=</code> v smislu, da je za slednjega dovolj,
@@ -23,8 +37,7 @@ implicitno že kar v argumentih predikata (glavi stavka).</p>
''',
'base_case': '''\
-<p>Si pomislil na robni pogoj? Kaj je najbolj enostaven primer, ko je element v seznamu?
-Do katerega elementa najlažje prideš?</p>
+<p>Si pomislil na robni pogoj? Kateri seznam lahko razdelim praktično brez dela?</p>
''',
'recursive_case': '''\
@@ -32,11 +45,11 @@ Do katerega elementa najlažje prideš?</p>
''',
'predicate_always_false': '''\
-<p>Vse kaže, da tvoj predikat vedno vrne <code>false</code>. Si mu dal pravilno ime, si se morda pri imenu zatipkal?</p>
+<p>Vse kaže, da tvoj predikat vedno vrne "false". Si mu dal pravilno ime, si se morda pri imenu zatipkal?</p>
<p>Č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?</p>
<p>Možno je seveda tudi, da so tvoji pogoji prestrogi ali celo nemogoči (kot bi bila npr. zahteva,
-da je <code>X</code> hkrati starš in sestra od <code>Y</code> ali kaj podobno zlobnega).</p>
+da je <code>X</code> <em>hkrati</em> večji in manjši od <code>Y</code> ali kaj podobno logično sumljivega).</p>
''',
'timeout': '''\
@@ -45,31 +58,46 @@ da je <code>X</code> hkrati starš in sestra od <code>Y</code> ali kaj podobno z
''',
'>_and_<_mixed_up': '''\
-<p>>_and_<_mixed_up</p>
+<p>Si zamešal pogoja? V seznamu manjših elementov so pristali večji in obratno. Tudi meni je to uspelo! ;)</p>
+<p><code>?- pivoting(4, [1,4,5,8,6,4,2], SmallerElems, GreaterElems).</code></p>
''',
'duplicates_not_considered': '''\
-<p>duplicates_not_considered</p>
+<p>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"!</p>
''',
'all_elements_in_either_S_or_G': '''\
-<p>all_elements_in_either_S_or_G</p>
+<p>Kako to, da prav <em>vsi</em> elementi seznama pristanejo ali med večjimi ali med manjšimi elementi?
+Napačen pogoj ali morda copy/paste napaka?</p>
''',
'arbitrary_solution': '''\
-<p>arbitrary_solution</p>
+<p>To je pa zlobna napaka. Za en seznam, ki ga vračaš, si lepo poskrbel, za drugega pa nisi. Če recimo glavo
+<code>H</code> vstaviš v seznam manjših elementov <code>[H|SmallerElems]</code> 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).</p>
''',
'unprotected_branch': '''\
-<p>unprotected_branch</p>
+<p>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.</p>
+<p>Poskusi spodnje vprašanje in zahtevaj <em>več</em> rešitev.</p>
+<p><code>?- pivoting(4, [1,4,5,8,6,4,2], SmallerElems, GreaterElems).</code></p>
''',
- 'forcing_result_onto_recursion': '''\
-<p>forcing_result_onto_recursion</p>
+ 'forcing_result_onto_recursion': '''
+<p>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.</p>
+<p>Je tvoj rekurzivni klic oblike <code>pivoting(P, T, [H|SmallerElems], GreaterElems)</code>? S tem vsiljuješ rekurziji
+da mora <emph>vrniti</emph> tudi glavo <code>H</code>, ki je sploh ne pozna, ker si jo ravnokar vzel stran! To moraš
+narediti ti z rezultatom, ki ti ga rekurzija vrne. Skratka, element <code>H</code> vstavi izven rekurzivnega klica.</p>
''',
'no_recursion_in_one_branch': '''\
-<p>no_recursion_in_one_branch</p>
+<p>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.</p>
''',
-
}
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).</p>
<p>Č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?</p>
<p>Možno je seveda tudi, da so tvoji pogoji prestrogi ali celo nemogoči (kot bi bila npr. zahteva,
-da je <code>N</code> enako kot <code>N + 1</code> ali kaj podobno logično zlobnega).</p>
+da je <code>X</code> <em>hkrati</em> večji in manjši od <code>Y</code> ali kaj podobno logično sumljivega).</p>
''',
'timeout': '''\
@@ -87,6 +87,8 @@ nov največji element? Poskusi spodnji klic.</p>
<p>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.</p>
+<p>Poskusi spodnje vprašanje in zahtevaj <em>več</em> rešitev.</p>
+<p><code>?- sins(3, [1,2,4,5,6], L).</code></p>
''',
'forgotten_heads': '''\