From 820e032e90b31507c4084148a099a0a159e01583 Mon Sep 17 00:00:00 2001 From: Aleksander Sadikov Date: Mon, 14 Mar 2016 16:28:57 +0100 Subject: Plans for divide/3 added. --- prolog/problems/lists/divide_3/sl.py | 45 ++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 25 deletions(-) (limited to 'prolog/problems/lists/divide_3/sl.py') diff --git a/prolog/problems/lists/divide_3/sl.py b/prolog/problems/lists/divide_3/sl.py index 23340cc..93bc699 100644 --- a/prolog/problems/lists/divide_3/sl.py +++ b/prolog/problems/lists/divide_3/sl.py @@ -39,29 +39,37 @@ implicitno že kar v argumentih predikata (glavi stavka).

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

Si pomislil na robni pogoj? Kaj je najbolj enostaven primer? Kaj, če ima seznam samo en element?

+

Si pomislil na robni pogoj? Kaj je najbolj enostaven primer? Kaj, če je seznam prazen?

''', - '[]_should_not_succeed': '''\ -

Kako si lahko uspešno našel zadnji element v praznem seznamu? Verjetno potrebuješ drugačen robni pogoj.

+ 'base_case_arbitrary': '''\ +

Kako je lahko rezultat delitve seznama poljuben seznam oz. karkoli?

+

Če je tvoj robni pogoj v stilu divide([], _, _) ali divide([X], [X|_], ...), +ga še enkrat premisli: kaj je rezultat delitve, kaj vračaš? Robni pogoj je vedno dokončno specificirana +rešitev, tu načeloma ni neznank (_ ali neinicializiranih spremenljivk) v tem kar se vrača.

''', - 'list_returned': '''\ -

Vračaš seznam namesto elementa.

+ 'second_base_case_missing': '''\ +

Rekurzija se ne konča vedno uspešno. Sta morda dva različna primera kako se lahko izteče? Saj veš, +sodo in liho ;) Je morda potreben še kakšen robni pogoj?

''', - 'clumsy_conc_use': '''\ -

Uporabljaš conc/3? Zanimiva ideja. Ne pozabi, da mora drugi seznam, ki ga konkateniraš -biti dolžine ena, če hočeš doseči to kar želiš. Torej vzorec oblike [X], kajne?

+ 'unsuccessful_conc_use': '''\ +

Uporabljaš conc/3? Pri tej nalogi to ni najboljša ideja, ker conc/3 deli "v kosih", +težko boš prišel do posameznih elementov. Poskusi raje brez.

''', - 'unsuccessful_conc_use': '''\ -

Uporabljaš conc/3? Zanimiva ideja, da se rešiti tudi tako. Vendar boš moral še malo premisliti. -Ne pozabi, conc/3 ima tri argumente, vsi so seznami. Premisli, kakšen vzorec potrebuješ...

+ '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 divide(T, [H1|...], [H2|...])? S tem vsiljuješ rekurziji +da mora vrniti tudi obe glavi, ki jih sploh ne pozna, ker si jih ti ravnokar vzel stran! To moraš +narediti ti z (obdelanimi) rezultati, ki jih rezurzija vrne. Skratka, elementa H1 in H2 +dodaj izven rekurzivnega klica.

''', 'recursive_case': '''\ -

Robni primer deluje. Kaj pa rekurzivni, splošni, primer?

+

Robni primeri delujejo. Kaj pa rekurzivni, splošni, primer?

''', 'predicate_always_false': '''\ @@ -75,18 +83,5 @@ da je X hkrati starš in sestra od Y ali kaj podobno z 'timeout': '''\

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?

-''', - - 'final_hint': '''\ -

Zanimivost: se spomniš kako smo rekli, da lahko predikat conc/3 uporabljamo za iskanje vzorcev? -Tudi zadnji element seznama je na nek način vzorec. Kaj se zgodi, če konkateniram poljuben seznam _ -in seznam dolžine ena (v tem vrstnem redu)? Seznam dolžine ena seveda zapišemo kot [Element].

-

Poskusi prolog vprašati tole:

-

?- conc(_, [Element], [a,b,c,d,e,f,q]).

-

Znaš sedaj dobiti zadnji element s pomočjo conc/3? To bo že še prišlo prav. Seveda pa je dostop -do zadnjega elementa še vedno potraten, O(n). Zato, če ni važno od kje ali kam dostopati, se splača vedno delati -s prvim elementom.

-

Kaj pa naredi tole? ;)

-

?- conc([a,b,c], [q], L).

''', } -- cgit v1.2.1