Prolog - Ayuda

 
Vista:
Imágen de perfil de alemon

Ayuda

Publicado por alemon (1 intervención) el 15/11/2005 22:35:15
alguien me puede decir donde meti mal los dedos ????
Hice el sig programa en visual prolog 5.2
un rompecabezas, una matriz de 3 x3 con 8 numeros desordenados, y un casillero libre para mover y ordenar estos numeros.
Use el metod de produccion con reglas y estrategia de control, use primero en profundidad. En la estrategia le paso el estado inicial del la matriz y el estado final.

al hacer TEST GOAL me tira una lista de errores que no entiendo.
Alguien me puede dar una mano ??

DOMAINS
cordx, cordy = integer
num = integer
pos = p(cordx,cordy,num)
est = pos*
lest = est*

PREDICATES
append(est,est)
pertenece(pos,est)
pertenece1(est,lest)
mov(cordx,cordy)
intercambio(est,pos,pos,est)
mover(est,est)
pp(est,est,integer,lest,lest)

CLAUSES
append([],L).
append([Ca|Co],[Ca|L]):- append(Co,L).

pertenece(E,[]):- fail.
pertenece(E,[C|_]):- E=C.
pertenece(E,[_|R]):- pertenece(E,R).

pertenece1(E,[]):- fail.
pertenece1(E,[C|_]):- E=C.
pertenece1(E,[_|R]):- pertenece1(E,R).

mov(X,Y):- X= -1, Y= 0.
mov(X,Y):- X= 1, Y= 0.
mov(X,Y):- X= 0, Y= -1.
mov(X,Y):- X= 0, Y= 1.

intercambio([],_,_,S).
intercambio([C|R],P1,P2,S):-
C=P1,
append([P2],S),
intercambio(R,P1,P2,S).
intercambio([C|R],P1,P2,S):-
C=P2,
append([P1],S),
intercambio(R,P1,P2,S).
intercambio([C|R],P1,P2,S):-
append([C],S),
intercambio(R,P1,P2,S).

mover(E1,E2):-
pertenece(p(X,Y,0),E1),
mov(Xp,Yp),
Xm = X + Xp, Ym = Y + Yp,
X <= 3, Y <= 3,
pertenece(p(Xm,Ym,N),E1),write(N),
intercambio(E1,p(X,Y,0),p(Xm,Ym,N),E2).

pp(E,E,_,[E],_).
pp(Ei,Ef,M,[Ei|R],L):-
M > 0,
mover(Ei,Em),
not(pertenece1(Em,L)),
M1= M-1, pp(Em,Ef,M1,R,[Em|L]).

GOAL
/* Ei = [p(1,3,1),p(2,3,8),p(3,3,5),p(1,2,4),p(2,2,3),p(3,2,1),p(1,1,7),p(2,1,2),p(3,1,0)].
Ef = [p(1,3,1),p(2,3,2),p(3,3,3),p(1,2,4),p(2,2,5),p(3,2,6),p(1,1,7),p(2,1,8),p(3,1,0)]. */
pp([p(1,3,1),p(2,3,8),p(3,3,5),p(1,2,4),p(2,2,3),p(3,2,1),p(1,1,7),p(2,1,2),p(3,1,0)],
[p(1,3,1),p(2,3,2),p(3,3,3),p(1,2,4),p(2,2,5),p(3,2,6),p(1,1,7),p(2,1,8),p(3,1,0)],
10,S,[]).

E;Test_Goal, pos: 276, 590 Nondeterministic clause: append
E;Test_Goal, pos: 358, 590 Nondeterministic clause: pertenece
E;Test_Goal, pos: 451, 590 Nondeterministic clause: pertenece1
E;Test_Goal, pos: 520, 590 Nondeterministic clause: mov
E;Test_Goal, pos: 620, 590 Nondeterministic clause: intercambio
E;Test_Goal, pos: 1067, 590 Nondeterministic clause: pp
E;Test_Goal, pos: 1023, 591 Nondeterministic predicate: mover
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda

Publicado por Facundo Rossi (1 intervención) el 08/11/2010 02:50:34
Delante de la declaracion de los predicates, debes incluir nondeterm para no que note arroje ese error. Ej:
PREDICATES
nondeterm append(est,est)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda

Publicado por Nico (1 intervención) el 22/12/2010 01:22:16
Cinco años mas tarde, vengo yo y respondo.. para quienes se encuentren con este problema, encuentren tmb la solucion =)

A todos los predicados que te diga "Nondeterministic clause", te tenes que poner "nondeterm" al comienzo.

En este caso, tu seccion PREDICATES queradia asi:

PREDICATES
nondeterm append(est,est)
nondeterm pertenece(pos,est)
nondeterm pertenece1(est,lest)
nondeterm mov(cordx,cordy)
nondeterm intercambio(est,pos,pos,est)
nondeterm mover(est,est)
nondeterm pp(est,est,integer,lest,lest)


Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda

Publicado por Facuuuu (1 intervención) el 28/09/2013 18:29:18
Genial man! al que encuentre esto, me sirvio y estaba puteando de lo lindo con el profesor que da la forma exacta para hacerlo pero sin el nondeterm :(
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar