From bf1447e2f16267283db600758384e2d9d3ac2c5d Mon Sep 17 00:00:00 2001 From: Aleksander Sadikov Date: Mon, 21 Mar 2016 18:34:06 +0100 Subject: Hints and plans for max/2 added. --- prolog/problems/lists_advanced/max_2/sl.py | 39 +++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'prolog') diff --git a/prolog/problems/lists_advanced/max_2/sl.py b/prolog/problems/lists_advanced/max_2/sl.py index c335978..07431d6 100644 --- a/prolog/problems/lists_advanced/max_2/sl.py +++ b/prolog/problems/lists_advanced/max_2/sl.py @@ -1,3 +1,5 @@ +# coding=utf-8 + name = 'max/2' slug = 'Poišči največji element v danem seznamu' @@ -10,6 +12,19 @@ description = '''\ M = 3. ''' +plan = ['''\ +

Kot vedno, poskusi prevesti na manjši problem. Recimo, da že imaš največji element v repu seznama...

+''', '''\ +

Največji element v repu (seznamu brez glave H) primerjaj z vrednostjo glave H, tisti, +ki je večji zmaga in ga vrneš!

+''', '''\ +

Če je podani seznam L sestavljen iz glave H in repa T ter predpostavimo, +da je največji element v T enak MaxT. Če dalje velja še, da je vrednost H +večja od MaxT, potem je H največji element v L. Ali pa velja, da je +vrednost H manjša od MaxT, v tem primeru pa je MaxT največji element v +L.

+'''] + hint = { 'eq_instead_of_equ': '''\

Operator == je strožji od operatorja = v smislu, da je za slednjega dovolj, @@ -24,8 +39,7 @@ implicitno že kar v argumentih predikata (glavi stavka).

''', 'base_case': '''\ -

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? Kaj je najkrajši seznam, ki ima očiten največji element?

''', 'recursive_case': '''\ @@ -37,7 +51,7 @@ Do katerega elementa najlažje prideš?

Č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).

+da je N enako kot N + 1 ali kaj podobno logično zlobnega).

''', 'timeout': '''\ @@ -46,26 +60,33 @@ da je X hkrati starš in sestra od Y ali kaj podobno z ''', 'empty_list_base_case': '''\ -

empty_list_base_case

+

V praznem seznamu boš težko našel največji element. Kaj, če se tokrat ustaviš malo prej?

''', 'list_instead_of_elem_base_case': '''\ -

list_instead_of_elem_base_case

+

Vrni element in ne seznam!

''', 'duplicates_not_covered': '''\ -

duplicates_not_covered

+

Si pomislil, da so v seznamu lahko tudi duplikati?

''', 'args_not_instantiated': '''\ -

args_not_instantiated

+

Napaka, ki si jo dobil od prologa, pomeni, da ob uporabi aritmetike niso podane vse vrednosti spremenljivk.

+

Si morda pozabil, da konjunkcija veže močneje od disjunkcije oz. da je vsak prologov stavek (veja, pravilo) +samostojen v smislu dosega spremenljivk? Morda je to problem. Pozorno poglej oba bloka kode (pred in za podpičjem), +oziroma obe pravili.

''', 'unprotected_branch': '''\ -

unprotected_branch

+

Zdi se mi, da si pozabil "zaščititi" eno izmed obeh vej. Obe veji (disjunkciji) potrebujeta pogoj, ne zanašaj se +na to, da če je prišel v drugo vejo, potem prva ne velja. Velja OR in ne XOR. Zato jih moraš ti narediti +ekskluzivne. Poskusi tole vprašanje in poglej vse možne rešitve, boš videl v čem je problem.

+

?- max([6,9,3,8,1], Max).

''', 'one_branch_missing': '''\ -

one_branch_missing

+

Si morda pozabil na eno izmed možnosti? Glava je lahko ali večja ali manjša od +največjega elementa v repu.

''', } -- cgit v1.2.1