2014-05-02 11 views
2

我目前正在研究方案,並遇到下列問題就來了:不同方案的程序「或」

證明或反駁了以下聲明: 過程我-或:

 (define my-or 
     (lambda (test1 test2) 
      (if test1 
       #t 
       test2))) 

的工作原理相同作爲內置程序「或」有兩個參數。 TIPP:

(或)=#F

(or <a1> ... <an>) = (if <a1> 
          #t 
         (or <a2> ... <an>)) 

,如果你反駁的聲明,發現其中兩個 程序之間的差異可以注意到的程序。我相信這兩個程序之間沒有區別,因爲它們對兩個參數的工作方式相同(這個樹形圖是基於過程if和or的球拍文檔描述的):??????????????????

     if/or 
        ..  .. 
       #f   #t 
       ..    .. 
      test2    outcome: #t 
      ..  .. 
     #f   #t 
     ..    .. 
    outcome: #f  outcome: #t 

而且,因爲如果我重寫我的,或者是在第二TIPP 提到的方式,我仍然得到同樣的輸出,例如:

 > (my-or (= 10 10) (> 2 5)) 
     --> #t 
    > (my-or (> 23 42) (< 5 2)) 
     --> #t 

改寫:

 > (if (= 10 10) #t (or (> 2 5))) 
     --> #t 
    > (if (> 23 42) #t (or (< 5 2))) 
     --> #f 

困擾我的唯一問題是我們應該反駁聲明,因爲提到:「如果您反駁了聲明,找到一個程序可以注意到兩個程序之間的區別。」

這就是爲什麼我不知道是否有人有一個想法反駁的聲明,或者如果有人可以證實,否則我的想法如何證明聲明是正確的..

回答

2

事實上,基於過程的版本my-or不同於內置的or。爲了證明這一點,只是試試這個:

(or 1 (/ 1 0)) 
=> 1 

(my-or 1 (/ 1 0)) 
=> /: division by zero 

說明:

  • 內置or特殊形式,意思是:通常申請評價程序規則是or不同(順便說一句,對於and也是如此)
  • or短路其參數的評估:返回非錯誤的第一個參數的值作爲結果返回,其餘的參數將不是進行評估!
  • my-or執行正常的函數調用,並且所有其參數將之前將它們傳遞給my-or的身體
  • 以上示出了示例,清楚地進行評價or不被零評​​估的劃分,它儘快返回,因爲它找到的第一個非假值,而my-or評估繼續之前都參數,因爲它由零
+0

感謝您的回答遇到一個部門它失敗!我收到以下輸出: >(或#T(/ 1 0)) #T >(我的 - 或#T(/ 1 0)) /:除零 我想這表明我 - 或繼續評估test2,「或」,但是,只評估test1 ...這是我應該注意到的嗎? –

+0

好吧 - 你的編輯很清楚:非常感謝! :) –

+0

我已經試過了,只是發現,我必須等待 - 不知道之前!會做:)有一個美好的夜晚 - 或者爲你下午,我想! –