summaryrefslogtreecommitdiff
path: root/prolog/problems/family_relations/descendant_2
diff options
context:
space:
mode:
Diffstat (limited to 'prolog/problems/family_relations/descendant_2')
-rw-r--r--prolog/problems/family_relations/descendant_2/en.py88
-rw-r--r--prolog/problems/family_relations/descendant_2/sl.py2
2 files changed, 86 insertions, 4 deletions
diff --git a/prolog/problems/family_relations/descendant_2/en.py b/prolog/problems/family_relations/descendant_2/en.py
index bc7b795..535ef23 100644
--- a/prolog/problems/family_relations/descendant_2/en.py
+++ b/prolog/problems/family_relations/descendant_2/en.py
@@ -2,12 +2,94 @@ name = 'descendant/2'
slug = 'the descendant relation'
description = '''\
-<p><code>descendant(X, Y)</code>: <code>X</code> is a descendant (child, grandchild, …) of <code>Y</code>.</p>
+<p><code>descendant(X, Y)</code>: <code>X</code> is a descendant (child, grandchild, ...) of <code>Y</code>.</p>
<pre>
?- descendant(patricia, X).
X = william ;
X = tina ;
X = thomas.
-</pre>'''
+</pre>
+<p><a target="_blank" href="[%@resource famrel.svg%]">Family trees</a> are
+described with predicates <code>parent/2</code>, <code>male/1</code>, and
+<code>female/1</code>.</p>
+'''
+
+plan = ['''\
+<p>I believe recursion is needed... how can we transpose the problem to a smaller one (a single step smaller that is)?</p>
+<p><img src="[%@resource Prolog_descendant_03.svg%]" alt="A descendant of someone, who is a child of Y, is also a descendant of Y." /></p>
+''', '''\
+<p>If <code>Z</code> is a parent of some <code>X</code> and at the same time
+<code>Z</code> is a descendant of <code>Y</code>,
+then <code>X</code> is also a descendant of <code>Y</code>.</p>
+''', '''\
+<p><img src="[%@resource Prolog_descendant_04.svg%]" alt="If X is a descendant of Z, and Z is a child of Y, then X is also a descendant of Y." /></p>
+''']
+
+hint = {
+ 'gender_is_irrelevant': '''\
+<p>Je spol res pomemben?</p>
+''',
+
+ 'gender_is_irrelevant_markup': '''\
+<p>Je to res potrebno?</p>
+''',
+
+ 'grandparent_used': '''\
+<p>Rešitev z "grandparent" bo premalo splošna, poskusi nadomestiti to z rekurzijo.
+Skratka, poskusi prevesti na "manjši" problem, npr. potomec v enem koraku manj
+(en korak bližji potomec)...</p>
+''',
+
+ 'grandparent_used_markup': '''\
+<p>Bi se dalo rešiti brez tega?</p>
+''',
+
+ 'base_case': '''\
+<p>Si pomislil na robni pogoj? Rekurzija se mora enkrat tudi ustaviti.
+Kaj je najbolj enostaven par (potomec, prednik)?</p>
+<p><img src="[%@resource Prolog_descendant_01.svg%]" /></p>
+''', # TODO: morda ta hint naredim z "more": najprej tekst, ob kliku pa še slika... (sicer je preveč očitno)
+
+ 'descendant_of_oneself': '''\
+<p>Kako je lahko nekdo potomec samega sebe? Iz trenutne verzije rešitve se da izpeljati tudi to.
+Premisli, morda se ti splača tudi grafično skicirati tvojo trenutno rešitev.</p>
+''',
+
+ 'descendant_of_oneself_with_or': '''\
+<p>Kako je lahko nekdo potomec samega sebe? Iz trenutne verzije rešitve se da izpeljati tudi to.
+Premisli, morda se ti splača tudi grafično skicirati tvojo trenutno rešitev.</p>
+<p>Morda se ti splača preveriti tudi uporabo podpičja. To praktično naredi dva ločena stavka oz. veji
+(eno ali drugo velja, morda tudi oboje). Vendar pazi, ker sta ti dve veji med seboj neodvisni
+-- vrednosti iz ene se ne prenašajo v drugo vejo.</p>
+''',
+
+ 'descendant_need_not_be_parent': '''\
+<p>Potomec <code>X</code> pravzaprav ne rabi imeti otrok...</p>
+''',
+
+ 'predicate_always_false': '''\
+<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 podobnega).</p>
+''',
+
+ 'timeout': '''\
+<p>Je morda na delu potencialno neskončna rekurzija? Kako se bo ustavila?</p>
+<p>Morda pa je kriv tudi manjkajoč, neustrezen ali preprosto nekompatibilen (s splošnim primerom) robni pogoj?</p>
+''',
+
+ 'wrong_direction': '''\
+<p>Si morda sprogramiral ravno obratno in zamenjal prednika s potomcem?
+<code>X</code> naj bo potomec od <code>Y</code> in ne obratno!</p>
+<p><img src="[%@resource Prolog_descendant_02.svg%]" /></p>
+''', # TODO: Tim, kako bi lahko še query poslali med parametri v Hint dict? Je to predvideno? Tukaj bi recimo pasalo...
+
+ 'final_hint': '''\
+<p>Zanimivost: nalogo bi lahko rešil tudi z uporabo rešitve za relacijo <code>ancestor/2</code>.
+Samo obrni spremenljivki <code>X</code> in <code>Y</code>;
+če je <code>X</code> potomec od <code>Y</code>, potem je <code>Y</code> prednik od <code>X</code>.</p>
+''',
+}
-hint = {}
diff --git a/prolog/problems/family_relations/descendant_2/sl.py b/prolog/problems/family_relations/descendant_2/sl.py
index 0547da7..8f7f34f 100644
--- a/prolog/problems/family_relations/descendant_2/sl.py
+++ b/prolog/problems/family_relations/descendant_2/sl.py
@@ -3,7 +3,7 @@ slug = 'the descendant relation'
description = '''\
<p><code>descendant(X, Y)</code>: <code>X</code> je potomec (otrok, vnuk,
-pravnukinja, …) od <code>Y</code>.</p>
+pravnukinja, ...) od <code>Y</code>.</p>
<pre>
?- descendant(patricia, Y).
Y = william ;