From cfbd840591f3b334790ab22daa3cb7b9c49ebc9c Mon Sep 17 00:00:00 2001
From: Aleksander Sadikov
Date: Wed, 2 Mar 2016 01:36:02 +0100
Subject: Improved hints for ancestor/2 and descendant/2.
---
.../problems/family_relations/ancestor_2/common.py | 16 ++++++++++++---
prolog/problems/family_relations/ancestor_2/sl.py | 22 ++++++++++++++++++---
.../family_relations/descendant_2/common.py | 13 +++++++++---
.../problems/family_relations/descendant_2/sl.py | 23 ++++++++++++++++------
4 files changed, 59 insertions(+), 15 deletions(-)
diff --git a/prolog/problems/family_relations/ancestor_2/common.py b/prolog/problems/family_relations/ancestor_2/common.py
index 6690e00..9346e5f 100644
--- a/prolog/problems/family_relations/ancestor_2/common.py
+++ b/prolog/problems/family_relations/ancestor_2/common.py
@@ -27,8 +27,10 @@ hint_type = {
'grandparent_used_markup': HintPopup('grandparent_used_markup'),
'base_case': Hint('base_case'),
'ancestor_to_oneself': Hint('ancestor_to_oneself'),
+ 'ancestor_to_oneself_with_or': Hint('ancestor_to_oneself_with_or'),
'descendant_need_not_be_parent': Hint('descendant_need_not_be_parent'),
'wrong_direction': Hint('wrong_direction'),
+ 'only_two_levels_deep': Hint('only_two_levels_deep'),
'timeout': Hint('timeout'),
}
@@ -83,15 +85,23 @@ def hint(code, aux_code):
[{'id': 'grandparent_used'}]
# missing/failed base case
- # TODO: how will ask_truth handle/return timeouts...
- # TODO: timeout is the same as fail in this particular case
if prolog.engine.ask_truthTO(engine_id,
'findall(X/Y, parent(X, Y), L), member(X/Y, L), \+ ancestor(X, Y)'):
return [{'id': 'base_case'}]
+ # two levels deep relation (up to grandparent) only
+ # warning: knowledge base dependent
+ if prolog.engine.ask_truthTO(engine_id,
+ 'findall(_, ancestor(X, Y), L1), length(L1, 23) ; \
+ findall(_, ancestor(X, Y), L2), length(L2, 55)'):
+ return [{'id': 'only_two_levels_deep'}]
+
# ancestor to oneself
if prolog.engine.ask_truthTO(engine_id, 'ancestor(X, X)'):
- return [{'id': 'ancestor_to_oneself'}]
+ if prolog.util.Token('SEMI', ';') in tokens:
+ return [{'id': 'ancestor_to_oneself_with_or'}]
+ else:
+ return [{'id': 'ancestor_to_oneself'}]
# descendant instead of ancestor (wrong direction)
# warning: knowledge base dependent
diff --git a/prolog/problems/family_relations/ancestor_2/sl.py b/prolog/problems/family_relations/ancestor_2/sl.py
index 03e9230..5cb8044 100644
--- a/prolog/problems/family_relations/ancestor_2/sl.py
+++ b/prolog/problems/family_relations/ancestor_2/sl.py
@@ -47,12 +47,27 @@ Skratka, poskusi prevesti na "manjši" problem, npr. prednik v enem koraku manj
''',
'base_case': '''\
-Si pomislil na robni pogoj? Kaj je najbolj enostaven par (prednik, potomec)?
+Si pomislil na robni pogoj? Rekurzija se mora enkrat tudi ustaviti.
+Kaj je najbolj enostaven par (prednik, potomec)?
''', # TODO: morda ta hint naredim z "more": najprej tekst, ob kliku pa še slika... (sicer je preveč očitno)
'ancestor_to_oneself': '''\
-Kako je lahko nekdo prednik samemu sebi?
+Kako je lahko nekdo potomec samega sebe? Premisli, morda se ti splača tudi grafično skicirati
+tvojo trenutno rešitev.
+''',
+
+ 'ancestor_to_oneself_with_or': '''\
+Kako je lahko nekdo potomec samega sebe? Premisli, morda se ti splača tudi grafično skicirati
+tvojo trenutno rešitev.
+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.
+''',
+
+ 'only_two_levels_deep': '''\
+Tvoja rešitev je premalo splošna. Prednik je lahko tudi bolj oddaljen kot so stari starši,
+npr. prababica ali prapradedek.
''',
'descendant_need_not_be_parent': '''\
@@ -66,7 +81,8 @@ Skratka, poskusi prevesti na "manjši" problem, npr. prednik v enem koraku manj
''',
'timeout': '''\
-Je morda na delu potencialno neskončna rekurzija?
+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?
''',
}
diff --git a/prolog/problems/family_relations/descendant_2/common.py b/prolog/problems/family_relations/descendant_2/common.py
index 4c7f8e3..70936da 100644
--- a/prolog/problems/family_relations/descendant_2/common.py
+++ b/prolog/problems/family_relations/descendant_2/common.py
@@ -27,9 +27,11 @@ hint_type = {
'grandparent_used_markup': HintPopup('grandparent_used_markup'),
'base_case': Hint('base_case'),
'descendant_of_oneself': Hint('ancestor_to_oneself'),
+ 'descendant_of_oneself_with_or': Hint('descendant_of_oneself_with_or'),
'descendant_need_not_be_parent': Hint('descendant_need_not_be_parent'),
'wrong_direction': Hint('wrong_direction'),
'timeout': Hint('timeout'),
+ 'final_hint': Hint('final_hint'),
}
test_cases = [
@@ -58,6 +60,10 @@ def test(code, aux_code):
prolog.engine.destroy(engine_id)
hints = [{'id': 'test_results', 'args': {'passed': n_correct, 'total': len(test_cases)}}]
+ if n_correct == len(test_cases):
+ tokens = prolog.util.tokenize(code)
+ if prolog.util.Token('NAME', 'ancestor') not in tokens:
+ hints += [{'id': 'final_hint'}]
return n_correct, len(test_cases), hints
def hint(code, aux_code):
@@ -83,15 +89,16 @@ def hint(code, aux_code):
[{'id': 'grandparent_used'}]
# missing/failed base case
- # TODO: how will ask_truth handle/return timeouts...
- # TODO: timeout is the same as fail in this particular case
if prolog.engine.ask_truthTO(engine_id,
'parent(Y, X), \+ descendant(X, Y)'):
return [{'id': 'base_case'}]
# descendant of oneself
if prolog.engine.ask_truthTO(engine_id, 'descendant(X, X)'):
- return [{'id': 'descendant_of_oneself'}]
+ if prolog.util.Token('SEMI', ';') in tokens:
+ return [{'id': 'descendant_of_oneself_with_or'}]
+ else:
+ return [{'id': 'descendant_of_oneself'}]
# ancestor instead of descendant (wrong direction)
# warning: knowledge base dependent
diff --git a/prolog/problems/family_relations/descendant_2/sl.py b/prolog/problems/family_relations/descendant_2/sl.py
index 949280f..2b638fd 100644
--- a/prolog/problems/family_relations/descendant_2/sl.py
+++ b/prolog/problems/family_relations/descendant_2/sl.py
@@ -48,12 +48,22 @@ Skratka, poskusi prevesti na "manjši" problem, npr. potomec v enem koraku manj
''',
'base_case': '''\
-Si pomislil na robni pogoj? Kaj je najbolj enostaven par (potomec, prednik)?
+Si pomislil na robni pogoj? Rekurzija se mora enkrat tudi ustaviti.
+Kaj je najbolj enostaven par (potomec, prednik)?
''', # TODO: morda ta hint naredim z "more": najprej tekst, ob kliku pa še slika... (sicer je preveč očitno)
'descendant_of_oneself': '''\
-Kako je lahko nekdo potomec samega sebe?
+Kako je lahko nekdo potomec samega sebe? Premisli, morda se ti splača tudi grafično skicirati
+tvojo trenutno rešitev.
+''',
+
+ 'descendant_of_oneself_with_or': '''\
+Kako je lahko nekdo potomec samega sebe? Premisli, morda se ti splača tudi grafično skicirati
+tvojo trenutno rešitev.
+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.
''',
'descendant_need_not_be_parent': '''\
@@ -61,7 +71,8 @@ Skratka, poskusi prevesti na "manjši" problem, npr. potomec v enem koraku manj
''',
'timeout': '''\
-Je morda na delu potencialno neskončna rekurzija?
+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?
''',
'wrong_direction': '''\
@@ -70,10 +81,10 @@ Skratka, poskusi prevesti na "manjši" problem, npr. potomec v enem koraku manj
''', # TODO: Tim, kako bi lahko še query poslali med parametri v Hint dict? Je to predvideno? Tukaj bi recimo pasalo...
- 'interesting_tidbit': '''\
-Zanimivost: nalogo bi lahko rešil tudi z uporabo rešitve za relacijo "ancestor".
+ 'final_hint': '''\
+
Zanimivost: nalogo bi lahko rešil tudi z uporabo rešitve za relacijo ancestor/2
.
Samo obrni spremenljivki X
in Y
;
če je X
potomec od Y
, potem je Y
prednik od X
.
-''', # TODO: trigger za interesting tidbit
+''',
}
--
cgit v1.2.1