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/problems/lists') 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