summaryrefslogtreecommitdiff
path: root/prolog
diff options
context:
space:
mode:
authorTimotej Lazar <timotej.lazar@fri.uni-lj.si>2016-05-22 18:07:57 +0200
committerTimotej Lazar <timotej.lazar@fri.uni-lj.si>2016-05-22 18:07:57 +0200
commit52a65d75cd7adc7983d4e6c45709b7571497ca9a (patch)
tree16944dd31bb7972cb368d2a49d92a68a26062c23 /prolog
parentbbcb29a202436fc0e222e187f1fadf0b1f305465 (diff)
Prolog: update initial code for denotational_semantics problems
Diffstat (limited to 'prolog')
-rw-r--r--prolog/problems/denotational_semantics/prog_8puzzle_2/common.py12
-rw-r--r--prolog/problems/denotational_semantics/prog_listswap_3/common.py27
2 files changed, 27 insertions, 12 deletions
diff --git a/prolog/problems/denotational_semantics/prog_8puzzle_2/common.py b/prolog/problems/denotational_semantics/prog_8puzzle_2/common.py
index c5b69da..22429cc 100644
--- a/prolog/problems/denotational_semantics/prog_8puzzle_2/common.py
+++ b/prolog/problems/denotational_semantics/prog_8puzzle_2/common.py
@@ -14,15 +14,3 @@ instr172 --> [right].
instr172 --> [up].
instr172 --> [down].
'''
-
-initial = '''\
-prog_8puzzle --> [begin], instructs, [end].
-
-instructs --> instr.
-instructs --> instr, instructs.
-
-instr --> [left].
-instr --> [right].
-instr --> [up].
-instr --> [down].
-'''
diff --git a/prolog/problems/denotational_semantics/prog_listswap_3/common.py b/prolog/problems/denotational_semantics/prog_listswap_3/common.py
index 3ad93e8..800717e 100644
--- a/prolog/problems/denotational_semantics/prog_listswap_3/common.py
+++ b/prolog/problems/denotational_semantics/prog_listswap_3/common.py
@@ -21,3 +21,30 @@ instr174((R0,C0)-->(R0,C)) -->
instr174((R0,C0)-->(R,C0)) -->
[swap], {swap(R0,C0,R)}.'''
+
+# nothing to do in this exercise
+initial = '''\
+prog_listswap(In-->Out) -->
+ [begin], instructs((In,1)-->(Out,_)), [end].
+
+% one instruction
+instructs((R0,C0)-->(R,C)) -->
+ instr((R0,C0)-->(R,C)).
+% sequence of instructions
+instructs((R0,C0)-->(R,C)) -->
+ instr((R0,C0)-->(R1,C1)),
+ instructs((R1,C1)-->(R,C)).
+
+% "left" and "right" instructions move the cursor (but not outside list bounds)
+instr((R0,C0)-->(R0,C)) -->
+ [left],
+ { C0 > 1, C is C0 - 1 ; C0 =< 1, C is C0 }.
+instr((R0,C0)-->(R0,C)) -->
+ [right],
+ { length(R0, LenR0), (C0 < LenR0, C is C0 + 1 ; C0 >= LenR0, C is C0) }.
+
+% "swap" instruction swaps the element under cursor with the element on the left
+instr((R0,C0)-->(R,C0)) -->
+ [swap],
+ { swap(R0, C0, R) }.
+'''