Diferencia entre programación lógica y programación funcional


He estado leyendo muchos artículos tratando de entender la diferencia entre la programación funcional y la lógica, pero la única deducción que he podido hacer hasta ahora es que la programación lógica define programas a través de expresiones matemáticas. Pero tal cosa no está asociada con la programación lógica.

Realmente apreciaría que se arrojara algo de luz sobre la diferencia entre la programación funcional y la lógica.

Author: Wouter Beek, 2011-11-28

8 answers

Yo no diría que la programación lógica define programas a través de expresiones matemáticas; eso suena más como programación funcional. La programación lógica utiliza expresiones lógicas (bueno, eventualmente la lógica es matemática).

En mi opinión, la principal diferencia entre la programación funcional y la lógica son los "bloques de construcción": la programación funcional usa funciones mientras que la programación lógica usa predicados. Un predicado no es una función; no tiene un valor de retorno. Dependiendo de la el valor de sus argumentos puede ser verdadero o falso; si algunos valores no están definidos, intentará encontrar los valores que harían verdadero el predicado.

Prolog en particular usa una forma especial de cláusulas lógicas llamadas Cláusulas Horn que pertenecen a la lógica de primer orden; Hilog usa cláusulas de lógica de orden superior.

Cuando escribes un predicado prolog estás definiendo una cláusula horn: foo :- bar1, bar2, bar3. significa que foo es verdadero si bar1, bar2 y bar3 es verdadero. tenga en cuenta que no dije si y solo if; puede tener varias cláusulas para un predicado:

foo:-
   bar1.
foo:-
  bar2.

Significa que foo es verdadero si bar1 es verdadero o si bar2 es verdadero

Algunos dicen que la programación lógica es un superconjunto de programación funcional ya que cada función podría expresarse como un predicado:

foo(x,y) -> x+y.

Podría escribirse como

foo(X, Y, ReturnValue):-
   ReturnValue is X+Y.

Pero creo que tales declaraciones son un poco engañosas

Otra diferencia entre lógica y funcional es retroceder. En la programación funcional una vez que ingrese el cuerpo de la función que no puede fallar y pase a la siguiente definición. Por ejemplo, puede escribir

abs(x) -> 
   if x>0 x else -x

O incluso usar guardias:

abs(x) x>0 -> x;
abs(x) x=<0 -> -x.

Pero no puedes escribir

abs(x) ->
   x>0,
   x;
abs(x) ->
   -x.

Por otro lado, en Prolog podrías escribir{[12]]}

abs(X, R):-
   X>0,
   R is X.
abs(X, R):-
   R is -X.

Si entonces llamas a abs(-3, R), Prolog probará la primera cláusula, y fallará cuando la ejecución alcance el punto -3 > 0 pero no obtendrás un error; Prolog probará la segunda cláusula y devolverá R = 3.

No creo que es imposible que un lenguaje funcional implemente algo similar (pero no he usado tal lenguaje).

En general, aunque ambos paradigmas son considerados declarativos, son bastante diferentes; tan diferentes que compararlos se siente como comparar estilos funcionales e imperativos. Yo sugeriría probar un poco de programación lógica; debería ser una experiencia alucinante. Sin embargo, debe tratar de entender la filosofía y no simplemente escribir programas; Prolog le permite para escribir en estilo funcional o incluso imperativo (con resultados monstruosos).

 57
Author: Thanos Tintinidis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-30 20:24:16

En pocas palabras:

En la programación funcional, su programa es un conjunto de definiciones de funciones. El valor devuelto para cada función se evalúa como una expresión matemática, posiblemente haciendo uso de argumentos pasados y otras funciones definidas. Por ejemplo, puede definir una función factorial, que devuelve un factorial de un número dado:

factorial 0 = 1                       // a factorial of 0 is 1
factorial n = n * factorial (n - 1)   // a factorial of n is n times factorial of n - 1 

En la programación lógica, su programa es un conjunto de predicados. Los predicados se definen generalmente como conjuntos de cláusulas, donde cada cláusula puede ser definido usando expresiones matemáticas, otros predicados definidos, y cálculo proposicional. Por ejemplo, puede definir un predicado 'factorial', que se mantiene siempre que el segundo argumento sea un factorial del primero:

factorial(0, 1).               // it is true that a factorial of 0 is 1
factorial(X, Y) :-             // it is true that a factorial of X is Y, when all following are true:
    X1 is X - 1,                   // there is a X1, equal to X - 1,
    factorial(X1, Z),              // and it is true that factorial of X1 is Z, 
    Y is Z * X.                    // and Y is Z * X

Ambos estilos permiten el uso de expresiones matemáticas en los programas.

 26
Author: socha23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-28 15:19:42

Primero, hay muchos puntos en común entre la programación funcional y la lógica. Es decir, muchas nociones desarrolladas en una comunidad también se pueden usar en la otra. Ambos paradigmas comenzaron con implementaciones bastante crudas y se esfuerzan por la pureza.

Pero quieres conocer las diferencias.

Así que tomaré Haskell por un lado y Prolog con restricciones por el otro. Prácticamente todos los sistemas Prolog actuales ofrecen restricciones de algún tipo, como B, Ciao, ECLiPSe, GNU, IF, SICStus, SWI, YAP, XSB. Por el bien del argumento, usaré una restricción muy simple dif/2 que significa desigualdad, que estaba presente incluso en la primera implementación de Prolog, por lo que no usaré nada más avanzado que eso.

Lo que falta programación funcional

La diferencia más fundamental gira en torno a la noción de una variable. En la programación funcional una variable denota un valor concreto. Este valor no debe estar completamente definido, sino solo las partes que se definen se pueden utilizar en los cálculos. Consideremos en Haskell:

> let v = iterate (tail) [1..3] 
> v
[[1,2,3],[2,3],[3],[],*** Exception: Prelude.tail: empty list

Después del 4to elemento, el valor es indefinido. Sin embargo, puede utilizar los primeros 4 elementos de forma segura:

> take 4 v
[[1,2,3],[2,3],[3],[]]

Tenga en cuenta que la sintaxis en programas funcionales está inteligentemente restringida para evitar que una variable quede indefinida.

En la programación lógica, una variable no necesita referirse a un valor concreto. Por lo tanto, si queremos una lista de 3 elementos, podríamos decir:

?- length(Xs,3).
Xs = [_G323, _G326, _G329].

En esta respuesta, los elementos de la lista son variables. Todas las instancias posibles de estas variables son soluciones válidas. Como Xs = [1,2,3]. Ahora, digamos que el primer elemento debe ser diferente a los elementos restantes:

?- length(Xs,3), Xs = [X|Ys], maplist(dif(X), Ys).
Xs = [X, _G639, _G642],
Ys = [_G639, _G642],
dif(X, _G642),
dif(X, _G639).

Más adelante, podríamos exigir que los elementos en Xs son todos iguales. Antes de escribirlo, lo probaré solo:

?- maplist(=(_),Xs).
Xs = [] ;
Xs = [_G231] ;
Xs = [_G231, _G231] ;
Xs = [_G231, _G231, _G231]  ;
Xs = [_G231, _G231, _G231, _G231] .

Ver que las respuestas contienen siempre la misma variable? Ahora, puedo combinar ambas consultas:

?- length(Xs,3), Xs = [X|Ys], maplist(dif(X), Ys), maplist(=(_),Xs).
false.

Así que lo que han demostrado aquí es que no hay 3 lista de elementos donde el primer elemento es diferente a los otros elementos y todos los elementos son iguales.

Esta generalidad ha permitido desarrollar varios lenguajes de restricción que se ofrecen como bibliotecas para sistemas Prolog, los más destacados son CLPFD y CHR.

No hay una forma sencilla de obtener una funcionalidad similar en la programación funcional. Puedes emular cosas, pero la emulación no es del todo igual.

Lo que falta programación lógica

Pero hay muchas cosas que faltan en la programación lógica que hacen que la programación funcional sea tan interesante. En particular:

Programación de orden superior: La programación funcional tiene aquí una tradición muy larga y ha desarrollado un rico conjunto de modismos. Para Prolog, las primeras propuestas se remontan a principios del decenio de 1980, pero todavía no es muy común. Al menos ISO Prolog tiene ahora el homólogo a aplicar llamado call/2, call/3 ....

Lambdas: De nuevo, es posible extender la programación lógica en esa dirección, el sistema más prominente es Lambda Prolog . Más recientemente, también se han desarrollado lambdas para ISO Prolog.

Sistemas de tipos: Ha habido intentos, como Mercurio, pero no ha captado mucho. Y no hay ningún sistema con funcionalidad comparable a las clases de tipo.

Pureza: Haskell es completamente pura, una función Integer -> Integer es una función. No letra pequeña al acecho. Y todavía se pueden realizar efectos secundarios. Los enfoques comparables están evolucionando muy lentamente.

Hay muchas áreas donde la programación funcional y lógica se superponen más o menos. Por ejemplo backtracking y holgazanería y comprensiones de la lista, evaluación perezosa y freeze/2, when/2, block. DCGs y mónadas. Dejaré que otros discutan estas cuestiones...

 21
Author: false,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-28 19:00:55

La programación lógica y la programación funcional utilizan diferentes "metáforas" para la computación. Esto a menudo afecta la forma en que piensa acerca de la producción de una solución, y a veces significa que diferentes algoritmos vienen naturalmente a un programador funcional que un programador lógico.

Ambos se basan en fundamentos matemáticos que proporcionan más beneficios para el código "puro"; código que no opera con efectos secundarios. Hay lenguajes para ambos paradigmas que imponen la pureza, así como lenguajes eso permite efectos secundarios sin restricciones, pero culturalmente los programadores de tales lenguajes tienden a todavía valorar la pureza.

Voy a considerar append, una operación bastante básica tanto en programación lógica como funcional, para agregar una lista al final de otra lista.

En la programación funcional, podríamos considerar append algo como esto:

append [] ys = ys
append (x:xs) ys = x : append xs ys

Mientras que en la programación lógica, podríamos considerar append para ser algo como esto:

append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).

Estos implementar el mismo algoritmo, e incluso trabajar básicamente de la misma manera, pero "significan" algo muy diferente.

El funcional append define la lista que resulta de añadir ys al final de xs. Pensamos append como una función de dos listas a otra lista, y el sistema de ejecución está diseñado para calcular el resultado de la función cuando invocamos en dos listas.

El append lógico define una relación entre tres listas, que es verdadera si la tercera lista es los elementos de la primera lista, seguido por los elementos de la segunda lista. Pensamos en append como un predicado que es verdadero o falso para cualquier 3 listas dadas, y el sistema de tiempo de ejecución está diseñado para encontrar valores que harán que este predicado sea verdadero cuando lo invocamos con algunos argumentos vinculados a listas específicas y algunos no vinculados.

Lo que hace que logical append sea diferente es que puedes usarlo para calcular la lista que resulta de anexar una lista a otra, pero puede también usarlo para calcular la lista que necesita agregar al final de otra para obtener una tercera lista (o si no existe tal lista), o para calcular la lista a la que necesita agregar otra para obtener una tercera lista, o para darle dos listas posibles que se pueden agregar juntas para obtener un tercio dado (y explorar todas las formas posibles de hacer esto).

Mientras que equivalente en que usted puede hacer cualquier cosa que usted puede hacer en uno en el otro, conducen a diferente formas de pensar en tu tarea de programación. Para implementar algo en la programación funcional, piensa en cómo producir su resultado a partir de los resultados de otras llamadas a funciones (que también puede tener que implementar). Para implementar algo en la programación lógica, piensa en qué relaciones entre tus argumentos (algunos de los cuales son de entrada y otros de salida, y no necesariamente los mismos de llamada a llamada) implicarán la relación deseada.

 16
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-29 03:43:26

Prolog, al ser un lenguaje lógico, te da un retroceso libre, es bastante notable.

Para elaborar, y preciso que de ninguna manera soy experto en ninguno de los paradigmas, me parece que la programación lógica es mucho mejor cuando se trata de resolver cosas. Porque eso es precisamente lo que hace el lenguaje (que aparece claramente cuando se necesita retroceder, por ejemplo).

 5
Author: m09,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-28 15:09:11

Creo que la diferencia es esta:

  • programación imperativa = acciones de modelado
  • programación de funciones = razonamiento de modelado
  • programación lógica = conocimiento de modelado

Elige lo que mejor se adapte a tu mente

 4
Author: Periklis Georgiou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-09 16:08:48

Programación Funcional: cuando 6PM, la luz encendida. programación lógica: cuando está oscuro, la luz encendida.

 1
Author: Pigeon The,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-01 00:35:06

La diferencia entre la programación funcional y la programación imperativa se basa en dos conceptos: -

A: - ¿Qué hacer ? b: - ¿Cómo hacerlo ?

Piensa en una computadora como un bebé recién nacido ahora quieres que ese bebé complete una tarea (¿Qué hacer?). Ahora que el bebé puede saber por sí mismo cómo lograr esa tarea si sabe que su programación funcional. Ahora si esa bahía no sabe cómo lograr esa tarea y necesita la ayuda de los programadores para hacer una lógica para ese concepto que esto es imperativa programación.

 -1
Author: Kamran Akbar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-10 14:34:11