summaryrefslogtreecommitdiff
path: root/prolog
AgeCommit message (Collapse)Author
2015-08-11Specify timeout when generating test casesTimotej Lazar
2015-08-11Silence warnings from ply.lex.lex()Timotej Lazar
2015-08-11Use Node class from monkey.util in parserTimotej Lazar
Also simplify rules for list expressions.
2015-08-11Add a parser for (simplified) PrologTimotej Lazar
2015-08-11Always lex , as COMMA, never as NAMETimotej Lazar
Also a testing loop to prolog.lexer.
2015-08-11Remove unused function from prolog.utilTimotej Lazar
2015-08-11Print a random failing test for incorrect solutionTimotej Lazar
2015-08-11prolog.engine: use .get() to access replyTimotej Lazar
In case SWI engine goes insane and returns a malformed reply (has happened). Also fix the test case in this file to use the new, classless methods.
2015-08-11Annotate tokens instead of splitting programTimotej Lazar
Instead of splitting the program by line numbers, do limited parsing (enough to distinguish , in "memb(X,Y)" from , in "a :- b, c."). Each token in the parsed program is annotated with rule and part number. Rewrite monkey.fix.step to take program as a sequence of annotated tokens instead of lists of lines and rules. Improve message passing to website.
2015-08-11Simplify calls to prolog.util.map_varsTimotej Lazar
2015-08-11Move normalize to prolog.utilTimotej Lazar
2015-08-11Clean up prolog.util.decomposeTimotej Lazar
2015-08-11Remove all trailing punctuation from linesTimotej Lazar
Remove trailing sequences of COMMAs and PERIODs when extracting edits from a trace. This is because subgoal order is rarely important in Prolog, and we don't care if the edit happened on the last line or not. This means that we treat for example "conc(A,B)," → "conc(A,B,C)." the same as "conc(A,B)" → "conc(A,B,C)".
2015-08-11Move monkey.prolog to root moduleTimotej Lazar
2015-08-11Move pymonkey stuff to monkey/Timotej Lazar
Importing pymonkey into webmonkey, let's see how this works.
2015-08-11Add prolog.engine.testTimotej Lazar
Depends on run_tests/3.
2015-08-11Improve error handling in PrologEngineTimotej Lazar
2015-08-11Delegate testing to a Prolog serverTimotej Lazar
... which obsoletes *a lot* of effort in making the testing procedure more robust in the past two years. Oh well. It seems to be the sanest way of coping with more than one simultaneous user (who could have predicted this use case?). The new way involves a PEngine server, and it seems to work quite well. Remember Knuth: premature optimization (as in ignoring possible solutions because they _might_ be to slow) is stupid. TODO: - library loading (again) - use of previous solution (again) - fix issues when converting non-ground terms to json Side note, constructivism works: in the past few days I have reached a much better but fundamentally ineffable intuition about Prolog, more so than in the past two years teaching it. So, fuck ITS and rather fix the schools by giving students something meaningful to do. Sigh.
2015-08-11PrologEngine: add load/unload functionsTimotej Lazar
2015-08-11Store test cases in PrologEngineTimotej Lazar
2015-08-11Add support for per-problem fact librariesTimotej Lazar
Each fact library is loaded at most once, so different problems can share the same library (e.g. family-relation problems).
2015-08-11Quote predicate name for abolish/1Timotej Lazar
2015-08-11Improve testing procedureTimotej Lazar
For each query: - generate a single solution - incorrect solution / timeout / other error → FAIL - generate (up to) ten solutions - more than one distinct solution found → FAIL - timeout is OK (a correct solution was found above) - if reached this point → PASS
2015-08-11Term.__iter__: create new Terms on each iterationTimotej Lazar
2015-08-11Mark solution predicates as static after loadingTimotej Lazar
This prevents incorrect student solutions from overwriting or adding to predicates in solution<n> modules.
2015-08-11Reorder functions in PrologEngineTimotej Lazar
Place functions for internal use at the end.
2015-08-11Use abolish/1 instead of erase/1 to remove clausesTimotej Lazar
Using erase/1 keeps the dynamic property for all defined predicates in the testing module. This overrides the clauses in solution modules. For example, if the user defines conc/3 in the solution for the dup/2 problem, the correct conc/3 would not get used even after unloading all user's clauses. This commit also plugs a couple of memory leaks by opening (and later discarding) a new Prolog frame in functions test, load_solution and mark_solved.
2015-08-11Improve handling of Prolog exceptionsTimotej Lazar
2015-08-11PrologEngine: disable autoloadTimotej Lazar
Turns out unix:dup/2 exists and is autoloaded if the student solution for dup/2 does not contain the predicate with this name; this can mess up subsequent tests.
2015-08-11Load prolog/lib.pl during PrologEngine initTimotej Lazar
This is always required for the safe_goal/1 predicate.
2015-08-11Add a test to prolog.engine and clean up a bitTimotej Lazar
2015-08-11Remember correct answers to test queriesTimotej Lazar
2015-08-11Start refactoring testing codeTimotej Lazar
Testing logic now lives in PrologEngine. The engine now has some notion of problems and users, which is necessary to avoid repeatedly loading code into Prolog. TODO: - support library loading - fix PrologEngine.test for unusual cases (more than one solution, …) - memoization of correct answers
2015-08-11Mark random and random_between as safe goalsTimotej Lazar
Required for exercise 25 (genlist).
2015-08-11Keep token positions when lexingTimotej Lazar
This will allow us to match line edits to original source locations.
2015-08-11Simplify prolog.util.map_varsTimotej Lazar
Return a single mapping instead of generating all possible permutations. Only the first solution was used anyway, with little effect on found solutions.
2015-08-11Add some ad-hoc test code to prolog/util.pyTimotej Lazar
2015-08-11Rework prolog query engineTimotej Lazar
Use exceptions to report errors. Used in the server branch.
2015-08-11Clean up prolog.engineTimotej Lazar
Use findnsols/4 to allow limiting the number of solutions found by prolog.engine.query. Add a basic test case to prolog.engine.
2015-08-11Add PL_clear_exception to prolog/core.pyTimotej Lazar
2015-08-11mv prolog/sandbox.pl prolog/lib.plTimotej Lazar
2015-08-11Cleanups in monkey.pyTimotej Lazar
2015-08-11Lexer: increase priority for t_commentTimotej Lazar
Multiline comments were not lexed correctly because /* was interpreted as an operator.
2015-08-11Move PQueue and utility functions into util.pyTimotej Lazar
2015-08-11Use immutable values in queueTimotej Lazar
2015-08-11Remove unnecessary check from prolog.util.composeTimotej Lazar
2015-08-11Fix two bugs in prolog.util.decomposeTimotej Lazar
2015-08-11Add call(predicate, arguments) to PrologEngineTimotej Lazar
Also disable error messages printed by swipl library.
2015-08-11Optimize prolog.util.stringify (~15% faster)Timotej Lazar
2015-08-11Improve testing procedureTimotej Lazar
- only run queries with correct code once - use msort/2 to implement quicksort/3, used for some tests - correctly split programs in the presence of =.. operator