使用高阶逻辑定义“对”的概念

时间:2017-05-19 12:43:10

标签: functional-programming logic lambda-calculus church-encoding

修改自动推理课程,我不太明白如何回答这个问题:

展示如何使用lambda抽象在高阶逻辑中定义对(x, y)的概念。定义一个函数π1,它返回这样一对的第一个元素。最后,显示π1(x, y) = x.

我在stackoverflow上发现了类似的问题,但它们都与我从未使用过的方案有关。可以理解英文/相关数学符号的解释

3 个答案:

答案 0 :(得分:3)

你去吧

PAIR := λx. λy. λp. p x y

π1 := λp. p (λx. λy. x)

π2 := λp. p (λx. λy. y)

π1 (PAIR a b) => a

π2 (PAIR a b) => b

查看Church encoding上的wiki条目,了解一些好的例子

答案 1 :(得分:2)

这个问题的主题是了解数据如何表示为函数。当你使用其他范例时,通常的思维方式是“数据=存储在变量中的东西”(可以是数组,对象,你想要的任何结构)。

但是当我们进行函数式编程时,我们也可以将数据表示为函数。 所以假设你需要一个函数对(x,y)

这是“伪”lisp语言:

(function pair x y = 
   lambda(pick) 
      if pick = 1 return x 
      else return y  )

该示例显示了一个返回lambda函数的函数,该函数需要一个参数。

(function pi this-is-pair = this-is-pair 1)

this-is-pair应该用一对函数构造,因此,参数是一个期望其他参数(pick)的函数。

现在,你可以测试你需要的东西

(pi (pair x y ) ) should return x

我强烈建议您观看有关compound data的视频。大多数示例都是在lisp上制作的,但理解这样的概念很有用。

答案 2 :(得分:0)

对或元组描述Products Domain,是集合A的所有元素和集合B的所有元素的并集:

A × B = { (a, b) | a ∈ A, b ∈ B }

这里,A和B是不同的类型,所以如果您使用像C,Java这样的语言程序,则可以使用(String, Integer)(Char, Boolean)(Double, Double) < / p>

现在,函数π1只是一个函数,它接受一对并返回第一个元素,这个函数通常在first中调用,而它就是π1(x, y) = x的样子,在另一个上你有第二个,做同样的事情,但返回第二个元素:

fst(a, b) = a
snd(a, b) = b

当我在大学学习签名“编程语言的特征”时,我们的教授推荐了这个 book,请参阅产品领域< / strong>很好地理解所有这些概念。