# coding=utf-8 id = 173 name = 'prog_8puzzle/3' slug = '8-puzzle-solving language with semantics' description = '''\

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 [begin], followed by any sequence of "instruction" symbols from the set {left, right, up, down}, and finally [end]. The starting symbol should be named prog_8puzzle.

The meaning of a word (program) in this language has the form In-->Out, 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 left, right, up and down is to move the blank tile in the given direction.

  ?- 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].

Helper predicates (already defined):
  findblank(List,I) returns the 1-based index I of the element 0 in List
  swap(List,I,J,NewList) creates NewList by swapping elements I and J in List

''' hint = {}