summaryrefslogtreecommitdiff
path: root/prolog/problems/denotational_semantics/prog_8puzzle_3
diff options
context:
space:
mode:
Diffstat (limited to 'prolog/problems/denotational_semantics/prog_8puzzle_3')
-rw-r--r--prolog/problems/denotational_semantics/prog_8puzzle_3/common.py37
-rw-r--r--prolog/problems/denotational_semantics/prog_8puzzle_3/en.py19
2 files changed, 56 insertions, 0 deletions
diff --git a/prolog/problems/denotational_semantics/prog_8puzzle_3/common.py b/prolog/problems/denotational_semantics/prog_8puzzle_3/common.py
new file mode 100644
index 0000000..415dc17
--- /dev/null
+++ b/prolog/problems/denotational_semantics/prog_8puzzle_3/common.py
@@ -0,0 +1,37 @@
+id = 173
+group = 'denotational_semantics'
+number = 82
+visible = True
+facts = 'denotational_semantics_aux__predicates'
+
+solution = '''\
+prog_8puzzle(R0 --> R) -->
+ [begin],
+ { findblank(R0,C0) },
+ instructs173(((R0,C0) --> (R,_C))),
+ [end].
+
+instructs173((R0,C0) --> (R,C)) -->
+ instr173((R0,C0) --> (R,C)).
+instructs173((R0,C0) --> (R,C)) -->
+ instr173((R0,C0) --> (R1,C1)), instructs173((R1,C1) --> (R,C)).
+
+instr173((R0,C0) --> (R,C)) -->
+ [left], {Pos is (C0-1) mod 3,
+ (Pos>0, C is C0-1, swap(R0,C0,C,R)
+ ;
+ Pos=0, C=C0, R=R0)}.
+instr173((R0,C0) --> (R,C)) -->
+ [right], {Pos is (C0-1) mod 3,
+ (Pos<2, C is C0+1, swap(R0,C0,C,R)
+ ;
+ Pos=2, C=C0, R=R0)}.
+instr173((R0,C0) --> (R,C)) -->
+ [up], { (C0>3, C is C0-3, swap(R0,C0,C,R)
+ ;
+ C0=<3, C=C0, R=R0)}.
+instr173((R0,C0) --> (R,C)) -->
+ [down], { (C0=<6, C is C0+3, swap(R0,C0,C,R)
+ ;
+ C0>6, C=C0, R=R0)}.
+'''
diff --git a/prolog/problems/denotational_semantics/prog_8puzzle_3/en.py b/prolog/problems/denotational_semantics/prog_8puzzle_3/en.py
new file mode 100644
index 0000000..c91b9e3
--- /dev/null
+++ b/prolog/problems/denotational_semantics/prog_8puzzle_3/en.py
@@ -0,0 +1,19 @@
+id = 173
+name = 'prog_8puzzle/3'
+slug = '8-puzzle-solving language with semantics'
+
+description = '''\
+<p>Write a DCG for solving 8-puzzles. The syntax for this language should be the same as in the previous exercise: the first symbol in every word is <code>[begin]</code>, followed by any sequence of "instruction" symbols from the set {<code>left</code>, <code>right</code>, <code>up</code>, <code>down</code>}, and finally <code>[end]</code>. The starting symbol should be named <code>prog_8puzzle</code>.</p>
+
+<p>The meaning of a word (program) in this language has the form <code>In-->Out</code>, mapping from input to output states. Each state is a (permuted) list of numbers from 0 to 8, where 0 stands for the empty square and other numbers for the corresponding tiles. The first three numbers in the list correspond to the top row of the 8-puzzle, the next three numbers to the middle row, and the last three numbers to the last row. The meaning of instructions <code>left</code>, <code>right</code>, <code>up</code> and <code>down</code> is to move the blank tile in the given direction.</p>
+
+<pre>
+ ?- prog_8puzzle([0,1,2,3,4,5,6,7,8]-->Out, [begin,down,right,end], []).
+ Out = [3,1,2,4,0,5,6,7,8].
+</pre>
+
+<p>Helper predicates (already defined):<br />
+&nbsp;&nbsp;<code>findblank(List,I)</code> returns the 1-based index <code>I</code> of the element 0 in <code>List</code><br />
+&nbsp;&nbsp;<code>swap(List,I,J,NewList)</code> creates <code>NewList</code> by swapping elements <code>I</code> and <code>J</code> in <code>List</code></p>'''
+
+hint = {}