Scheme `or `在方案不当行为中的作用

Scheme `or `在方案不当行为中的作用,scheme,lambda-calculus,Scheme,Lambda Calculus,我正在尝试在Scheme中编写或函数 (define or (lambda (p q) p p q)) 如果我做了(或#t#f)我得到了#f 我在做什么有什么问题 我在youTube上的视频中看到了λpq.ppq。正确的Lambda演算定义如下 (define or (lambda (p q) (p p q))) ; (or p q) = {p AND p} OR {{NOT p} AND q} (define xor (lambda (p q) (p (not q) q)

我正在尝试在Scheme中编写
函数

(define or
  (lambda (p q) p p q))
如果我做了
(或#t#f)
我得到了
#f

我在做什么有什么问题


我在youTube上的视频中看到了
λpq.ppq

正确的Lambda演算定义如下

(define or (lambda (p q) (p p q)))        ; (or p q) = {p AND p} OR {{NOT p} AND q}

(define xor (lambda (p q) (p (not q) q))) ; (xor p q) = {p AND {NOT q}} OR {{NOT p} AND q}

(define not (lambda (t) (lambda (p q) (t q p))))   ; ((not t) p q) = (t q p)
(注意帕伦夫妇!)。但是
#t
#f
将无法使用这些。他们期望

(define true (lambda (p q) p))    ; (true p q) = p

(define false (lambda (p q) q))   ; (false p q) = q
你可以跟我核对一下

((or true false) #t #f)  ; #t

((xor false false) #t #f) ; #f

((xor true false) #t #f)  ; #t

根据您的定义,缺少一组括号:

(define or (lambda (p q)  p p q  ))
           ;            ^^     ^^
它减少为:

(or #t #f)
=
(let ([p #t] [q #f])
   p
   p
   q )
=
(let ([p #t] [q #f])
   q )
=
#f

要使
p
应用于
p
q
,我们需要将表单括在括号中,如下所示:
(p p p q)
。没有它们,您只有三个连续的表达式、三个变量,并且只返回最后一个值,就像返回整体结果一样。这是
q
的值。哪个是
#f

你确定吗?我运行了你的代码,它可以像expectedI一样工作。我添加了一个屏幕盖,它对我不起作用?(这样读者就可以在不必输入的情况下尝试你的示例),除非你试图学习lambda演算,否则你发现的视频可能对你不是很有用。我是用语法(define or(lambda(pq)(ppq))来尝试的但正如你所说,它与t和f不起作用,我不明白为什么。(定义t(lambda(pq)p))(定义f(lambda(pq)q))((或tt)t#t#t)->t((或tf)t#f)->t((或ft)f#t)->f*错误((或f f)f#f)->t使用if使其按预期工作,但按您的方式使用仍然会为第三种情况提供错误的输出。我不想要{p和p}或{NOT p}和q}这不对,我想要{p和p}或{p和q}我在DrRacket中测试了我的代码。它按原样工作。使用
if
使其成为正常的方案/球拍代码。在这个答案中使用它使它成为一个方案代码,它实现了“if”,lambda演算方式。我想这就是你问题的本质。我在youtube上的一个视频中看到了我想要写的东西:lambdapq.ppq你能告诉我怎么写这个吗。啊哈,那么我的答案是对的。您看到了λpq.ppq,这是一种隐含应用程序的LC语法。在常规的Scheme语法中,它正是我向您展示的:(lambda(pq)(ppq)),其中应用程序通过括号显示。等等,不,您测试错了!根据定义,它必须是
((或…任何…)\t\f)