name = 'prog_8puzzle/3' slug = 'jezik za reševanje igre Osem s pomenom' description = '''\
Napiši DCG za jezik igre Osem (angl. 8-puzzle). Sintaksa tega jezika naj bo enaka kot v prejšnji nalogi.
Prvi simbol vsake besede je simbol [begin]
, temu pa sledi poljubno zaporedje "ukazov" iz nabora
{left
, right
, up
down
}, na koncu pa je simbol
[end]
. Začetni nekončni simbol naj se imenuje prog_8puzzle
.
Pomen besede (programa) v tem jeziku ima obliko In-->Out
in pomeni preslikavo
med vhodnim seznamom In
in izhodnim seznamom Out
. Stanje je seznam (permutiran)
števil od 0 do 8, kjer 0 pomeni prazno polje, ostala števila pa pomenijo oznako ustrezne ploščice. Prva
tri števila v seznamu predstavljajo prvo vrstico stanja igre Osem, naslednja tri srednjo vrstico in zadnja
tri spodnjo vrstico. Pomen ukazov left
, right
, up
in down
je "premik" praznega polja v ustrezni smeri.
?- 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].
Pomožni predikati (že definirani):
findblank(List,I)
vrne položaj (indeks z bazo 1) I
elementa 0 v seznamu List
swap(List,I,J,NewList)
ustvari seznam NewList
tako, da zamenja elementa na mestih I
in J
v seznamu List