2011-11-19 19 views
7

He estado tratando de aprender Prolog, y estoy totalmente perplejo sobre lo que hace el predicado s(). Lo veo a menudo y hay tan pocos recursos en Internet sobre Prolog que no puedo encontrar una respuesta.¿Qué hace el predicado s() en Prolog?

Ej.

/* sum(Is,S) is true if S is the sum of the list of integers Is.   */ 
    sum([],0). 
    sum([0|Is],S):-sum(Is,S). 
    sum([s(I)|Is], s(Z)):-sum([I|Is],Z). 
+0

¿Qué versión de intérprete de prólogo usas? –

+0

Uso: SWI-Prolog versión 5.10.1 para amd64 – okin33

Respuesta

14

s/1 no hace nada en sí mismo, y no es realmente un predicado. Son solo términos, una representación del sucesor de su argumento. Por lo tanto, s(0) se utiliza para representar al sucesor de 0 (es decir, 1), s(s(0)) se utiliza para representar al sucesor de s(0) (es decir, 2), etc., etc. Están tan extendidos en Prolog porque Prolog es un lenguaje bastante bueno para realizar cálculos simbólicos, mientras que incluso las operaciones aritméticas simples parecen torpes, lo que significa que no están perfectamente integradas con el paradigma de programación.

+8

muy bien dicho, + s (0) XD –

+1

Esto explica, muy bien, por qué la salida de mis programas usando s/1 era tan extraña. Muchas gracias, gran explicación! – okin33

1

s/1 significa sucesora. Se usa para representar números de una manera lógicamente accesible.

+1

¡Eso tiene sentido, muchas gracias! Sin embargo, cuando intento ejecutar un recuento de programa que usa s/1 obtengo un resultado extraño en la forma de: ? - mycount (a, [a, a], N). N = s (s (0)); N = s (0); N = s (0); N = 0; falso. – okin33

0

Es una implementación de Prolog específica. Se refiere a un sucesor-predicado, vea this para más información

+1

's (X)' no es específico de la implementación. Es un functor arbitrario. Pruebe 't (X)' o 'succ (X)' en su lugar. – false

Cuestiones relacionadas