diff options
Diffstat (limited to 'prolog/problems/lists/dup_2/sl.py')
-rw-r--r-- | prolog/problems/lists/dup_2/sl.py | 47 |
1 files changed, 20 insertions, 27 deletions
diff --git a/prolog/problems/lists/dup_2/sl.py b/prolog/problems/lists/dup_2/sl.py index eeefbd0..1513dda 100644 --- a/prolog/problems/lists/dup_2/sl.py +++ b/prolog/problems/lists/dup_2/sl.py @@ -27,18 +27,28 @@ potem je to skupaj ravno podvojen seznam.</p> hint = { 'eq_instead_of_equ': '''\ <p>Operator <code>==</code> je strožji od operatorja <code>=</code> v smislu, da je za slednjega dovolj, -da elementa lahko naredi enaka (unifikacija). Morda z uporabo <code>=</code> narediš predikat -<code>insert/3</code> delujoč tudi v kakšni drugi smeri. To bo kasneje znalo priti prav!</p> +da elementa lahko prilagodi (unifikacija).</p> <p>Seveda pa lahko nalogo rešiš brez obeh omenjenih operatorjev, spomni se, da lahko unifikacijo narediš implicitno že kar v argumentih predikata (glavi stavka).</p> ''', 'eq_instead_of_equ_markup': '''\ -<p>Morda bi bil bolj primeren operator za unifikacijo (=)?</p> +<p>Morda bi šlo brez tega?</p> +''', + + 'base_case_missing_[]': '''\ +<p>Tvoj robni pogoj je sicer smiselen, a ne deluje za poseben primer: prazen seznam. Malce ga predelaj. +Ne naredi pa dveh robnih pogojev, ker bo to prineslo nov problem: pravilne rešitve se bodo podvajale.</p> +''', + + 'base_case_arbitrary': '''\ +<p>Kako je lahko rezultat podvajanja praznega seznama poljuben seznam oz. karkoli? +Matematiki bi rekli: "Dvakrat nič je nič in ne karkoli."</p> +<p>Če je tvoj robni pogoj <code>dup([], _).</code>, ga še enkrat premisli: kaj je rezultat podvajanja?</p> ''', 'base_case': '''\ -<p>Si pomislil na robni pogoj? Na katero mesto v seznamu najlažje vstaviš nek element?</p> +<p>Si pomislil na robni pogoj? Kakšen seznam najlažje "podvojiš"?</p> ''', 'recursive_case': '''\ @@ -58,28 +68,11 @@ da je <code>X</code> hkrati starš in sestra od <code>Y</code> ali kaj podobno z <p>Morda pa je kriv tudi manjkajoč, neustrezen ali preprosto nekompatibilen (s splošnim primerom) robni pogoj?</p> ''', - 'ins_results_in_empty_list': '''\ -<p>Kako je lahko rezultat vstavljanja v seznam prazen seznam?</p> -<p>Če je to tvoj robni pogoj, ga še enkrat premisli: kaj je rezultat vstavljanja?</p> -''', - - 'ins_results_in_arbitrary_result': '''\ -<p>Kako je lahko rezultat vstavljanja v seznam poljuben seznam oz. karkoli?</p> -<p>Če je to tvoj robni pogoj, ga še enkrat premisli: kaj je rezultat vstavljanja?</p> -''', - - 'lost_heads': '''\ -<p>Element je vstavljen, ampak vsi pred njim so se pa izgubili, kajne? -Si pozabil dati glavo nazaj na začetek seznama, ko se vračaš iz rekurzije?</p> -<p>Poskusi postaviti naslednje vprašanje prologu in preglej <emph>vse</emph> rešitve:</p> -<p><code>?- insert(q, [a,b,c,d], L).</code></p> -''', - - 'leading_heads_all_x': '''\ -<p>Si morda pozabil (copy/paste?) in uporabil <code>[X|T]</code> namesto bolj splošnega -<code>[H|T]</code> v rekurzivnem primeru?</p> -<p>Od spodnjih dveh vprašanj prologu prvo deluje, drugo pa ne.</p> -<p><code>?- insert(d, [d,d,d,d,e,f,g], L).</code></p> -<p><code>?- insert(d, [a,b,c,d,e,f,g], L).</code></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>dup(T, [H,H|...])</code>? S tem vsiljuješ rekurziji +da mora <emph>vrniti</emph> tudi podvojeno glavo. To moraš narediti ti z (obdelanim) rezultatom, ki ga rezurzija vrne. +Skratka, [H,H] dodaj izven rekurzivnega klica.</p> ''', } |