Acciones

Diferencia entre revisiones de «Ejemplo 1»

De Lógica computacional y teoría de modelos (2019-20)

(Página creada con «<source lang = "prolog"> % Definimos las dimensiones del tablero #const anchura = 5. dim(1..anchura). % Para cada casilla distinta a (1,1) le asignamos un solo movimiento:…»)
 
 
(No se muestra una edición intermedia del mismo usuario)
Línea 1: Línea 1:
 
<source lang = "prolog">
 
<source lang = "prolog">
% Definimos las dimensiones del tablero
+
% Definimos las dimensiones del tablero:
#const anchura = 5.
+
#const n = 5.
dim(1..anchura).
+
dim(1..n).
  
% Para cada casilla distinta a (1,1) le asignamos un solo movimiento: izda,
+
% Para cada casilla distinta a (1,1) le asignamos un solo parent: izquierda,
% dcha, arriba o abajo.
+
% derecha, arriba o abajo.
1 {mueve(X,Y, 0,-1); mueve(X,Y, 1,0);
+
1 {parent(X,Y, 0,-1); parent(X,Y, 1,0);
   mueve(X,Y, -1,0); mueve(X,Y, 0,1)} 1 :- dim(X), dim(Y), (X,Y) != (1,1).
+
   parent(X,Y, -1,0); parent(X,Y, 0,1)} 1 :- dim(X), dim(Y), (X,Y) != (1,1).
  
 
% Definimos la propiedad alcanzable. Esta se cumple trivialmente en la casilla
 
% Definimos la propiedad alcanzable. Esta se cumple trivialmente en la casilla
Línea 13: Línea 13:
 
% alcanzable también será alcanzable:
 
% alcanzable también será alcanzable:
 
alcanzable(1,1).
 
alcanzable(1,1).
alcanzable(X,Y) :- mueve(X,Y,XP,YP), alcanzable(X+XP,Y+YP).
+
alcanzable(X,Y) :- parent(X,Y,DX,DY), alcanzable(X+DX,Y+DY).
  
% Obligamos a que la raíz del árbol sea alcanzable desde cualquier casilla
+
% La raíz del árbol debe ser alcanzable desde cualquier casilla.
 
:- dim(X), dim(Y), not alcanzable(X,Y).
 
:- dim(X), dim(Y), not alcanzable(X,Y).
  
% Nos van a interesar las soluciones que tengan pocos desplazamientos verticales.
+
% Minimizamos el número de movimientos verticales:
vertical(X,Y) :- mueve(X,Y,0,1).
+
vertical(X,Y) :- parent(X,Y,0,1).
vertical(X,Y) :- mueve(X,Y,0,-1).
+
vertical(X,Y) :- parent(X,Y,0,-1).
 
#minimize {X,Y: vertical(X,Y) }.
 
#minimize {X,Y: vertical(X,Y) }.
  
 
% Presentación:
 
% Presentación:
#show mueve/4.
+
#show parent/4.
 +
 
 +
 
  
 
</source>
 
</source>

Revisión actual del 09:57 3 feb 2020

% Definimos las dimensiones del tablero:
#const n = 5.
dim(1..n).

% Para cada casilla distinta a (1,1) le asignamos un solo parent: izquierda,
% derecha, arriba o abajo.
1 {parent(X,Y, 0,-1); parent(X,Y, 1,0);
   parent(X,Y, -1,0); parent(X,Y, 0,1)} 1 :- dim(X), dim(Y), (X,Y) != (1,1).

% Definimos la propiedad alcanzable. Esta se cumple trivialmente en la casilla
% (1,1), y cualquier casilla desde la cual se haga un movimiento a una casilla
% alcanzable también será alcanzable:
alcanzable(1,1).
alcanzable(X,Y) :- parent(X,Y,DX,DY), alcanzable(X+DX,Y+DY).

% La raíz del árbol debe ser alcanzable desde cualquier casilla.
:- dim(X), dim(Y), not alcanzable(X,Y).

% Minimizamos el número de movimientos verticales:
vertical(X,Y) :- parent(X,Y,0,1).
vertical(X,Y) :- parent(X,Y,0,-1).
#minimize {X,Y: vertical(X,Y) }.

% Presentación:
#show parent/4.