首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >逻辑编程与函数式编程的区别

逻辑编程与函数式编程的区别
EN

Stack Overflow用户
提问于 2011-11-28 22:48:31
回答 5查看 32.5K关注 0票数 77

我一直在阅读许多文章,试图理解函数式编程和逻辑编程之间的区别,但到目前为止,我唯一能做的推论是,逻辑编程通过数学表达式定义程序。但这样的事情与逻辑编程无关。

对于函数式编程和逻辑编程之间的区别,我真的很感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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;一个谓词可以有多个子句:

代码语言:javascript
复制
foo:-
   bar1.
foo:-
  bar2.

表示如果bar1为true或bar2为true,foo为true

有人说逻辑编程是函数式编程的超集,因为每个函数都可以表示为谓词:

代码语言:javascript
复制
foo(x,y) -> x+y.

可以写成

代码语言:javascript
复制
foo(X, Y, ReturnValue):-
   ReturnValue is X+Y.

但我认为这样的说法有点误导。

逻辑和函数之间的另一个区别是回溯。在函数式编程中,一旦进入函数体,就不能失败并转到下一个定义。例如,您可以编写

代码语言:javascript
复制
abs(x) -> 
   if x>0 x else -x

或者甚至使用守卫:

代码语言:javascript
复制
abs(x) x>0 -> x;
abs(x) x=<0 -> -x.

但是你不能写

代码语言:javascript
复制
abs(x) ->
   x>0,
   x;
abs(x) ->
   -x.

另一方面,在Prolog中你可以这样写

代码语言:javascript
复制
abs(X, R):-
   X>0,
   R is X.
abs(X, R):-
   R is -X.

如果调用abs(-3, R),Prolog将尝试第一个子句,并在执行到达-3 > 0点时失败,但不会收到错误;Prolog将尝试第二个子句并返回R = 3

我不认为函数式语言实现类似的东西是不可能的(但我没有使用过这样的语言)。

总而言之,尽管这两种范式都被认为是声明性的,但它们是完全不同的;如此不同,以至于比较它们就像是比较函数式和命令式风格。我建议尝试一下逻辑编程;这应该是一次令人难以置信的经历。但是,您应该尝试理解其中的原理,而不是简单地编写程序;Prolog允许您以函数式甚至命令式的方式编写(具有可怕的结果)。

票数 68
EN

Stack Overflow用户

发布于 2011-11-28 23:11:12

简而言之:

在函数式编程中,您的程序是一组函数定义。每个函数的返回值都作为数学表达式进行计算,可能会使用传递的参数和其他定义的函数。例如,您可以定义一个factorial函数,该函数返回给定数字的阶乘:

代码语言:javascript
复制
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的阶乘,它就会成立:

代码语言:javascript
复制
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

这两种样式都允许在程序中使用数学表达式。

票数 30
EN

Stack Overflow用户

发布于 2011-11-28 23:09:12

Prolog,作为一种逻辑语言,给你提供了自由的回溯,这是相当明显的。

详细地说,我准确地说,我不是任何范式的专家,在我看来,逻辑编程在解决问题时要好得多。因为这正是语言所做的(例如,当需要回溯时,它会清晰地显示出来)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8297574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档