我一直在阅读许多文章,试图理解函数式编程和逻辑编程之间的区别,但到目前为止,我唯一能做的推论是,逻辑编程通过数学表达式定义程序。但这样的事情与逻辑编程无关。
对于函数式编程和逻辑编程之间的区别,我真的很感激。
发布于 2011-11-28 23:15:30
我不会说逻辑编程通过数学表达式定义程序;这听起来更像是函数式编程。逻辑编程使用逻辑表达式(好吧,逻辑最终是数学)。
在我看来,函数式编程和逻辑编程之间的主要区别在于“构建块”:函数式编程使用函数,而逻辑编程使用谓词。谓词不是函数;它没有返回值。根据其参数的值,它可能是true或false;如果一些值未定义,它将尝试找到使谓词为true的值。
Prolog特别使用了一种特殊形式的逻辑子句,称为Horn clauses,属于一阶逻辑;Hilog使用更高阶逻辑的子句。
当你写一个prolog谓词时,你是在定义一个horn子句:foo :- bar1, bar2, bar3.
意味着如果bar1,bar2和bar3为真,foo也为真。请注意,我没有说if和only if;一个谓词可以有多个子句:
foo:-
bar1.
foo:-
bar2.
表示如果bar1为true或bar2为true,foo为true
有人说逻辑编程是函数式编程的超集,因为每个函数都可以表示为谓词:
foo(x,y) -> x+y.
可以写成
foo(X, Y, ReturnValue):-
ReturnValue is X+Y.
但我认为这样的说法有点误导。
逻辑和函数之间的另一个区别是回溯。在函数式编程中,一旦进入函数体,就不能失败并转到下一个定义。例如,您可以编写
abs(x) ->
if x>0 x else -x
或者甚至使用守卫:
abs(x) x>0 -> x;
abs(x) x=<0 -> -x.
但是你不能写
abs(x) ->
x>0,
x;
abs(x) ->
-x.
另一方面,在Prolog中你可以这样写
abs(X, R):-
X>0,
R is X.
abs(X, R):-
R is -X.
如果调用abs(-3, R)
,Prolog将尝试第一个子句,并在执行到达-3 > 0
点时失败,但不会收到错误;Prolog将尝试第二个子句并返回R = 3
。
我不认为函数式语言实现类似的东西是不可能的(但我没有使用过这样的语言)。
总而言之,尽管这两种范式都被认为是声明性的,但它们是完全不同的;如此不同,以至于比较它们就像是比较函数式和命令式风格。我建议尝试一下逻辑编程;这应该是一次令人难以置信的经历。但是,您应该尝试理解其中的原理,而不是简单地编写程序;Prolog允许您以函数式甚至命令式的方式编写(具有可怕的结果)。
发布于 2011-11-28 23:11:12
简而言之:
在函数式编程中,您的程序是一组函数定义。每个函数的返回值都作为数学表达式进行计算,可能会使用传递的参数和其他定义的函数。例如,您可以定义一个factorial
函数,该函数返回给定数字的阶乘:
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
在逻辑编程中,你的程序是一组谓词。谓词通常定义为子句集,其中每个子句都可以使用数学表达式、其他定义的谓词和命题演算来定义。例如,您可以定义一个“factorial”谓词,只要第二个参数是first的阶乘,它就会成立:
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
这两种样式都允许在程序中使用数学表达式。
发布于 2011-11-28 23:09:12
Prolog,作为一种逻辑语言,给你提供了自由的回溯,这是相当明显的。
详细地说,我准确地说,我不是任何范式的专家,在我看来,逻辑编程在解决问题时要好得多。因为这正是语言所做的(例如,当需要回溯时,它会清晰地显示出来)。
https://stackoverflow.com/questions/8297574
复制相似问题