summaryrefslogtreecommitdiff
path: root/prolog/problems/family_relations/descendant_2/en.py
blob: 535ef23a07d0d028dd8a84f62d8714c0c5f298bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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>
<pre>
?- descendant(patricia, X).
  X = william ;
  X = tina ;
  X = thomas.
</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>
''',
}