逻辑编程在clojure中的应用:clojure.core.logic

1. 逻辑编程思维:

  逻辑编程(逻辑程序设计)是种编程范型,它设置答案须匹配的规则来解决问题,而非设置步骤来解决问题。过程是:

事实+规则=结果
  简单的说,事实就是一些已知输入,规则是应该遵循的限定条件,输入和输出应该遵循一定的规则,然后找出所有满足这些规则的输出,便是结果。在逻辑编程时,我们没必要去关心寻找结果的过程,而注重的是输出结果。   逻辑编程的要点是将正规的逻辑风格带入计算机程序设计之中,数学家和哲学家发现逻辑是有效的理论分析工具,很多问题可以自然地表示成一个理论。说需要解答一个问题,通常与解答一个新的假设是否跟现在的理论无冲突等价。逻辑提供了一个证明问题是真还是假的方法。创建证明的方法是人所皆知的,故逻辑是解答问题的可靠方法。逻辑编程系统则自动化了这个程序,人工智能在逻辑编程的发展中发挥了重要的影响。 #### **2. clojure.core.logic概述:**   clojure.core.logic是clojure一个库,专门为了实现逻辑编程,core.logic是miniKanren的一个实现。miniKanren中一个重要的概念就是goal,根据goal来推测可能的结果,这就是它的核心概念。   我们在使用core.logic编程时,获取逻辑编程的结果,一般都遵循以x下形式:
   (run* [logic-variable]
       logic-expressions)
   ;;or
   (run n [logic-variable]
       logic-expressions)

  run或者run函数可以执行逻辑表达式,返回满足条件的结果。返回的结果是一个关于logic-variable的数组。如果是run则返回所有满足逻辑表达式条件的逻辑变量,如果是run n,则返回前n个满足条件的变量。这里要注意的一点是:普通的逻辑表达式的返回结果只有两种:succeed/fail,如果找到满足条件的结果,则返回succeed,否则返回fail。只有使用run函数才能返回最终我们想要的输出结果。下面是run函数的使用示例:

;;首先要导入clojure.core.logic库
(use 'clojure.core.logic)

;;使用run*,会返回所有满足条件的结果
(run* [q]
     ;;这里是逻辑表达式,后面会讲到
     (conde
       [(== q 1)]
       [(== q 2)]
       [(== q 3)]
       ))
;;=>(1 2 3)

;;返回前两个结果
(run 2 [q]
     (conde
       [(== q 1)]
       [(== q 2)]
       [(== q 3)]
       ))
;;=> (1 2)

;;如果n大于所有满足条件结果的总数,则与run*返回结果一致
(run 4 [q]
     (conde
       [(== q 1)]
       [(== q 2)]
       [(== q 3)]
       ))
;;=> (1 2 3)

  当然run函数也可以接收多个参数,如果是多个参数,则以数组的形式返回:

;;接收两个参数,最后返回结果是一个包含数组的序列
(run* [q1 q2]
      (== q1 1)
      (== q2 1)
      )
;;=> ([1 1])

####3. 逻辑表达式以及常用函数:
  逻辑表达式的返回结果都是succeed或者fail,一个逻辑表达式中可以继续嵌套另外一个逻辑表达式,下面在介绍clojure中的常用逻辑函数同时穿插的介绍如何使用逻辑编程:

#####(1)==/!=/membero函数:
  “==”/"!="函数用于判断两个逻辑变量是否相等或者不相等,是最常用的逻辑函数,而(membero x l)函数则表示只有x属于数组l时才会返回succeed:

;;找出等于1的数字
(run* [q] (== q 1))
;;=> (1)

;;找出不等于1且属于数组[1 2 3]中的数字
;;;;这里的(!= q 1)与(membero q [1 2 3])两个逻辑表达式是与的关系(也就是必须两个逻辑表达式同时满足才返回succeed)
(run* [q] 
     (!= q 1)
     ;;q只有是数组[1 2 3]中的一个元素,才会返回succeed
     (membero q [1 2 3]))
;;=> (2 3)

#####(2)fresh函数:
  这个函数在逻辑编程时特别重要,如果我们想在逻辑表达式中用到其他变量怎么办?怎么像其它语言一样去声明一个局部变量??fresh函数正是来解决以上疑问的,fresh函数可以声明几个局部的逻辑变量,有了这些局部逻辑变量以后,您就可以在逻辑表达式中随意发挥了:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值