/* trace kiir, mentes, ment */ include "grapdecl.pro" domains lista=integer* database /* N A E H Allas*/ nyilt( integer, integer, integer, integer, lista ) zart( integer, integer, integer, integer, lista ) mentes(lista) regi(lista) predicates atalakit(lista,lista, integer) /* megkeresi az atalakito utat */ hasonlit(lista,lista) /* megnezi, hogy a ket lista egyenlo-e */ mozgat(integer,lista,lista) /* a lepesi szabalyok */ ment(integer,integer) /* kiirja a lepessorozatot */ /* szetbont( lista, lista, integer, integer, integer, integer, integer, lista) */ kiir kirak(lista) /* kirak egy allapotot(szoveges) */ megoldas( lista, lista) helytelen( lista, lista, integer) minimum ( lista, integer, integer) legjobb( integer, integer, integer, integer, lista) balra( lista, lista ) jobbra( lista, lista ) balra2( lista, lista ) jobbra2( lista, lista ) /* totext tographic grkirak(integer,lista) grkirakegy(integer,integer,integer) grkiir */ clauses /*---------------------------------------------------------------------------*/ balra( [ Lf1 |[ 0 |Lv ]], [ 0 |[Lf1|Lv] ] ). balra( [ Lf | Lv] , [ Lf| Uv] ):- balra(Lv,Uv). jobbra( [ 0 |[ Lf1 |Lv ]], [ Lf1 |[ 0 |Lv ] ] ). jobbra( [ Lf | Lv] , [ Lf| Uv] ):- jobbra(Lv,Uv). balra2( [ Lf1 |[ Lf2 | [ 0|Lv ]]], [ 0 |[ Lf2 | [ Lf1|Lv ]]] ). balra2( [ Lf | Lv] , [ Lf| Uv] ):- balra2(Lv,Uv). jobbra2( [ 0 |[ Lf1 | [ Lf2|Lv ]]], [ Lf2 |[ Lf1 | [ 0|Lv ]]] ). jobbra2( [ Lf | Lv] , [ Lf| Uv] ):- jobbra2(Lv,Uv). /*---------------------------------------------------------------------------*/ /* 11111 '1'1'0'2'2' 222222 */ mozgat( 1, L1, L2 ):- balra( L1, L2 ). mozgat( 2, L1, L2 ):- jobbra( L1, L2 ). mozgat( 3, L1, L2 ):- balra2( L1, L2 ). mozgat( 4, L1, L2 ):- jobbra2( L1, L2 ). /*---------------------------------------------------------------------------*/ atalakit(_,Y,N):- legjobb(N,A,T1,T2,X), hasonlit(X,Y), retractall(nyilt(N,A,T1,T2,X)), assertz(zart(N,A,T1,T2,X)), save("allas.txt"), ment(N,A),!. atalakit(_,Y,N):- nl, write("Lepes: ", N), nl, legjobb(N,E,T1,T2,Regi), retractall(nyilt(N,E,T1,T2,Regi)), assertz(zart(N,E,T1,T2,Regi)), mozgat(A,Regi,Uj), not( zart(_,_,_,_,Uj) ), write("."), UjN=N+1, helytelen(Uj,Y,D), H=D+UjN, assertz(nyilt( UjN, A, E, H, Uj)), fail. atalakit(X,Y,N):- UjN=N+1, atalakit(X,Y,UjN). /*---------------------------------------------------------------------------*/ hasonlit( [], []). hasonlit( [ Lf | Lv ],[ Lf | Uv ] ):- hasonlit(Lv,Uv). /*---------------------------------------------------------------------------*/ ment(N,A):- zart(N,A,E,_,X), asserta(mentes(X)), M=N-1, ment(M,E). ment(_,_):- mentes(A), retractall(mentes(A)). /*---------------------------------------------------------------------------*/ kirak( [] ):- nl, readchar(_). kirak( [ Lf | Lv ] ):- writef("%d ", Lf), kirak( Lv ). /*---------------------------------------------------------------------------*/ megoldas(X,Y):- retractall(_), assertz(regi(X)), helytelen(X,Y,D), H=D-1, assertz(nyilt( -1, 0, 0, H, X)), atalakit( X, Y, -1), fail. megoldas(_,_). /*---------------------------------------------------------------------------*/ helytelen([],[],0). helytelen([Lf1|Lv1],[Lf1|Lv2],A):- helytelen(Lv1,Lv2,A). helytelen([Lf1|Lv1],[Lf2|Lv2],A):- not(Lf1=Lf2), helytelen(Lv1,Lv2,X), A=X+1. /*---------------------------------------------------------------------------*/ minimum([],A,A). minimum([Lf|Lv],A,B):- Lf < A, minimum(Lv,Lf,B); minimum(Lv,A,B). /*---------------------------------------------------------------------------*/ legjobb(N,A,E,H,Allas):- findall(D,nyilt(_,_,_,D,_),L), minimum(L,500,H), nyilt(N,A,E,H,Allas), !. /*---------------------------------------------------------------------------*/ kiir :- save("kiir.txt"), mentes(X), kirak(X), fail. kiir. /*---------------------------------------------------------------------------*/ goal megoldas( [1, 1, 1, 0, 2, 2, 2] ,[ 2, 2, 2, 0, 1, 1, 1 ]), nl, kiir, readchar(_).