From db15c60df2cbc9c310422e1ce0fd4409acc4ce01 Mon Sep 17 00:00:00 2001
From: Aleksander Sadikov
Date: Fri, 11 Mar 2016 21:58:10 +0100
Subject: Hints for conc/3 added. And some misc bits here & there.
---
prolog/problems/lists/conc_3/common.py | 14 ++++++++++++--
prolog/problems/lists/conc_3/sl.py | 10 +++++++++-
prolog/problems/lists/memb_2/common.py | 8 +++++++-
prolog/problems/lists/memb_2/sl.py | 4 ++++
4 files changed, 32 insertions(+), 4 deletions(-)
(limited to 'prolog')
diff --git a/prolog/problems/lists/conc_3/common.py b/prolog/problems/lists/conc_3/common.py
index ce81bbe..3ed35bc 100644
--- a/prolog/problems/lists/conc_3/common.py
+++ b/prolog/problems/lists/conc_3/common.py
@@ -25,6 +25,7 @@ hint_type = {
'base_case': Hint('base_case'),
'timeout': Hint('timeout'),
'final_hint': Hint('final_hint'),
+ 'second_list_iteration': Hint('second_list_iteration'),
}
test_cases = [
@@ -76,12 +77,21 @@ def hint(code, aux_code):
# recursion is getting bigger and bigger
+# # missing/failed base case
+# if not prolog.engine.ask_truthTO(engine_id, 'conc([], [qa,qb,qc], [qa,qb,qc])'):
+# return [{'id': 'base_case'}]
+
+ # shortening the second list instead of first list
+ if prolog.engine.ask_truthTO(engine_id,
+ 'conc([a,b,c], [1,2,3,4], L), (L = [1,2,3,4,a,b,c] ; L = [4,3,2,1,a,b,c])'):
+ return [{'id': 'second_list_iteration'}]
+
# missing/failed base case
- if not prolog.engine.ask_truthTO(engine_id, 'memb(qq, [qq,_,_,_])'):
+ if not prolog.engine.ask_one(engine_id, 'conc([], [qa,qb,qc], [qa,qb,qc])'):
return [{'id': 'base_case'}]
# target predicate seems to always be false
- if not prolog.engine.ask_truth(engine_id, 'memb(_, [_,_,_,_,_,_])'):
+ if not prolog.engine.ask_truth(engine_id, 'conc([_,_,_,_,_,_], [_,_,_], _)'):
return [{'id': 'predicate_always_false'}]
except socket.timeout as ex:
diff --git a/prolog/problems/lists/conc_3/sl.py b/prolog/problems/lists/conc_3/sl.py
index 779b3ed..1fd0500 100644
--- a/prolog/problems/lists/conc_3/sl.py
+++ b/prolog/problems/lists/conc_3/sl.py
@@ -41,7 +41,8 @@ implicitno že kar v argumentih predikata (glavi stavka).
'base_case': '''\
Si pomislil na robni pogoj? Kaj je najbolj enostaven primer?
-Kaj bi bil, recimo, rezultat, če je prvi seznam kar prazen?
+Kaj bi bil, recimo, rezultat, če je prvi seznam kar prazen? (Samo prvi seznam naj bo prazen,
+v drugem seznamu je lahko karkoli.)
''',
'predicate_always_false': '''\
@@ -56,6 +57,13 @@ da je X
hkrati starš in sestra od Y
ali kaj podobno z
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?
Morda npr. v rekurziji zmanjšuješ prvi seznam, ustaviš pa se pri praznem drugem seznamu (ali obratno)?
+''',
+
+ 'second_list_iteration': '''\
+Kot kaže zmanjšuješ in "obdeluješ" drugi seznam. Mehanizem je pravi, ampak vrstni red na koncu pa ni.
+Raje zmanjšuj prvi seznam in pusti drugega kot je.
+Pa še drug razlog za ta vrstni red je: tako bomo vsi imeli enako, standardno, rešitev in bomo
+conc/3
uporabljali na enak način. To je zelo pomembno za kasneje.
''',
'final_hint': '''\
diff --git a/prolog/problems/lists/memb_2/common.py b/prolog/problems/lists/memb_2/common.py
index c45168d..119363a 100644
--- a/prolog/problems/lists/memb_2/common.py
+++ b/prolog/problems/lists/memb_2/common.py
@@ -23,6 +23,7 @@ hint_type = {
'eq_instead_of_equ': Hint('eq_instead_of_equ'),
'predicate_always_false': Hint('predicate_always_false'),
'base_case': Hint('base_case'),
+ 'recursive_case': Hint('recursive_case'),
'timeout': Hint('timeout'),
'final_hint': Hint('final_hint'),
}
@@ -77,9 +78,14 @@ def hint(code, aux_code):
return [{'id': 'base_case'}]
# target predicate seems to always be false
- if not prolog.engine.ask_truth(engine_id, 'memb(_, [_,_,_,_,_,_])'):
+ if not prolog.engine.ask_truthTO(engine_id, 'memb(_, [_,_,_,_,_,_])'):
return [{'id': 'predicate_always_false'}]
+ # base case works, the recursive doesn't (but it doesn't timeout)
+ # this may be left as the last, most generic hint
+ if not prolog.engine.ask_truth(engine_id, 'memb(qQ, [qa,qb,qQ,qc])'):
+ return [{'id': 'recursive_case'}]
+
# TODO: Tim, can we include 'fail'-used as a general hint?
except socket.timeout as ex:
diff --git a/prolog/problems/lists/memb_2/sl.py b/prolog/problems/lists/memb_2/sl.py
index c1b0a47..b133fdb 100644
--- a/prolog/problems/lists/memb_2/sl.py
+++ b/prolog/problems/lists/memb_2/sl.py
@@ -42,6 +42,10 @@ 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š?
+''',
+
+ 'recursive_case': '''\
+Robni primer deluje. Kaj pa rekurzivni, splošni, primer?
''',
'predicate_always_false': '''\
--
cgit v1.2.1