En primer lugar, soy completamente nuevo en el prólogo y estoy tratando de escribir una longitud de predicado (M, X, N) que es cierto, si M difiere de N más que X.

Escribí el siguiente caso de prueba que es cierto si M (= dec.5) y N (= dec.2) difieren más que X (= dec.2). Y es cierto en este caso porque 5 y 2 tienen una diferencia de 3 que es más que 2:

?- length(s(s(s(s(s(0))))), s(s(0)), s(s(0))).
   true .

Sé que el prólogo funciona de forma recursiva, por lo que me pregunto si puedo construir dicho predicado con condiciones (por ejemplo, <,>) como en lenguajes como C, o si hay otra forma de hacerlo en prólogo. Perdón por esta simple pregunta, pero acabo de comenzar con prolog.

2
SEPS 21 oct. 2017 a las 13:00

3 respuestas

La mejor respuesta

Podrías construir predicados para mayor o menor. Por ejemplo:

greater_than(s(_), 0).
greater_than(s(X), s(Y)) :-
    greater_than(X, Y).

Y de manera similar:

less_than(0, s(_)).
less_than(s(X), s(Y)) :-
    less_than(X, Y).

Si quieres encontrar la diferencia absoluta, puedes hacer algo como esto:

abs_diff(0, 0, 0).
abs_diff(s(X), 0, s(X)).
abs_diff(0, s(X), s(X)).
abs_diff(s(X), s(Y), D) :-
    abs_diff(X, Y, D).

Esos conceptos deberían ayudar a poner en marcha algunas ideas sobre cómo resolver el resto del problema.

3
lurker 21 oct. 2017 a las 11:49

Prueba esto:

?- length(s(s(s(s(s(0))))), s(s(0)), s(s(0))).

length(s(_),0,0).
length(s(M),s(X),s(N)) :- length(M,X,N).

Tenga en cuenta que los predicados de Prolog no devuelven valores, por lo que no devuelven true o false. O tienen éxito o no. El intérprete solo le dice si su programa tiene éxito o no.

0
Enigmativity 21 oct. 2017 a las 10:14

Esta respuesta sigue a la respuesta fina de @ lurker y mejora el determinismo del predicado auxiliar abs_diff/3 al utilizar indexación de la cláusula del primer argumento.

Presentamos x_y_dist/3:

x_y_dist(0, Y, Y).
x_y_dist(s(X), Y, Z) :-
   y_sx_dist(Y, X, Z).

y_sx_dist(0, X, s(X)).
y_sx_dist(s(Y), X, Z) :-
   x_y_dist(X, Y, Z).

Consulta de muestra:

?- x_y_dist(X, Y, s(s(0))).                             % |X-Y| = 2
(  X =           0     , Y =         s(s(0))            % |0-2| = 2
;  X =       s(s(0))   , Y =             0              % |2-0| = 2
;  X =         s(0)    , Y =       s(s(s(0)))           % |1-3| = 2
;  X =     s(s(s(0)))  , Y =           s(0)             % |3-1| = 2
;  X =       s(s(0))   , Y =     s(s(s(s(0))))          % |2-4| = 2
;  X =   s(s(s(s(0)))) , Y =         s(s(0))            % |4-2| = 2
;  X =     s(s(s(0)))  , Y =   s(s(s(s(s(0)))))         % |3-5| = 2
;  X = s(s(s(s(s(0))))), Y =       s(s(s(0)))           % |5-3| = 2
;  X =   s(s(s(s(0)))) , Y = s(s(s(s(s(s(0))))))        % |4-6| = 2
;  .........
)
3
repeat 23 oct. 2017 a las 09:39