4.1.用函數(shù)模擬自然數(shù),習題詳解

代碼:
// 2.布爾值,如果
// 如果 [條件]為……真或假 那么 [選擇一] 否則 [選擇二]
// (選擇一,選擇二)中,如果 條件為……真,那么 [選擇一]
// (選擇一,選擇二)中,如果 條件為……假,否則 [選擇二]
真 = (選擇一,選擇二)=>選擇一;
假 = (選擇一,選擇二)=>選擇二;
如果 = (條件,選擇一,選擇二)=>條件(選擇一,選擇二);
真(上天=>上天,入地=>入地);//上天=>上天
((選擇一,選擇二)=>選擇一)(上天=>上天,入地=>入地);
上天=>上天;
真(好=>好,壞=>壞);//好=>好
假(好=>好,壞=>壞);//壞=>壞
如果(真,上天=>上天,入地=>入地);//上天=>上天
((條件,選擇一,選擇二)=>條件(選擇一,選擇二))(真,上天=>上天,入地=>入地);
真(上天=>上天,入地=>入地);
上天=>上天;
如果(假,上天=>上天,入地=>入地);//入地=>入地
// 3.1.真值表
非 = (條件)=>如果(條件,假,真);
非(真);//假
如果(真,假,真);
非(假);//真
如果(假,假,真);
//為什么賦值語法很有用?
非(非(真));
非(假);
真;
//展開后
非(非(真));
((條件)=>如果(條件,假,真))(((條件)=>如果(條件,假,真))(真));
((條件)=>((條件,選擇一,選擇二)=>條件(選擇一,選擇二))(條件,假,真))(((條件)=>((條件,選擇一,選擇二)=>條件(選擇一,選擇二))(條件,假,真))(真));
((條件)=>((條件,選擇一,選擇二)=>條件(選擇一,選擇二))(條件,((選擇一,選擇二)=>選擇二),((選擇一,選擇二)=>選擇一)))(((條件)=>((條件,選擇一,選擇二)=>條件(選擇一,選擇二))(條件,((選擇一,選擇二)=>選擇二),((選擇一,選擇二)=>選擇一)))((選擇一,選擇二)=>選擇一));
((條件)=>((條件,選擇一,選擇二)=>條件(選擇一,選擇二))
??(條件,((選擇一,選擇二)=>選擇二),((選擇一,選擇二)=>選擇一)))
????(((條件)=>((條件,選擇一,選擇二)=>條件(選擇一,選擇二))
????????(條件,((選擇一,選擇二)=>選擇二),((選擇一,選擇二)=>選擇一)))
??????????((選擇一,選擇二)=>選擇一));
// 3.2.或,條件一,條件二任意一個真,那么為真,否則為假
或 = (條件一,條件二) =>
??如果(條件一,真,如果(條件二,真,假));
或(真,真);//真
如果(真,真,如果(真,真,假));
真;
或(真,假);//真
或(假,真);//真
或(假,假);//假
// 3.2.與,條件一,條件二都為真,那么為真,否則為假
與 = (條件一,條件二) =>?
????如果(條件一,如果(條件二,真,假),假)
與(真,真);//真
與(真,假);//假
與(假,真);//假
與(假,假);//假
// 第三部分:構建自然數(shù)
//2.零
零=道=>道;
//3. 0~6
零;// 0
加=>零;//1
加=>加=>零;//2
加=>加=>加=>零;//3
加=>加=>加=>加=>零;//4
加=>加=>加=>加=>加=>零;//5
加=>加=>加=>加=>加=>加=>零;//6
()=>零;//1
()=>()=>零;//2
()=>()=>()=>零;//3
()=>()=>()=>()=>零;//4
()=>()=>()=>()=>()=>零;//5
()=>()=>()=>()=>()=>()=>零;//6
(()=>零)()
零
//4.前繼 函數(shù)
//前繼(加=>加=>零)??加=>零
前繼 = 自然數(shù)=>自然數(shù)()
//5.后繼 函數(shù)
//后繼(加=>加=>零);?加=>加=>加=>零;
自然數(shù)=>加=>自然數(shù);
后繼 = 自然數(shù)=>()=>自然數(shù);
//6.1.加法 3+1
加=>加=>加=>零;
加=>加=>加=>加=>零;
后繼(加=>加=>加=>零);//后繼(3) 結果 4
//6.2.加法 3+2 = 3+1+1?
加=>加=>加=>零;
后繼(后繼(加=>加=>加=>零));
//6.3.加法 3+3 = 3+1+1+1?
加=>加=>加=>零;
后繼(后繼(后繼(加=>加=>加=>零)));
//6.4.加法?
// (數(shù)一,數(shù)二)=> 后繼(后繼(后繼(數(shù)一)))...
// 加(三,零) 三
// 加(三,一)?
// 加(后繼(三),前繼(一))?
// 加(四,零)?
// 加(三,二)?
// 加(四,前繼(二))?
// 加(五,前繼(前繼(二)))?
// 加(五,零)?
// todo 待實現(xiàn)
為零=(自然數(shù))=>自然數(shù)===零?真:假;// 后面解釋或替換掉這個函數(shù).
// def 為零(自然數(shù)):
//???if(自然數(shù) == 零):
//?????return 真
//???else:
//?????return 假
加 = (數(shù)一,數(shù)二) =>?
????如果(為零(數(shù)二)
??????,數(shù)一
??????,加(后繼(數(shù)一),前繼(數(shù)二))
????);
零;// 0
一 = 加=>零;//1
二 = 加=>加=>零;//2
三 = 加=>加=>加=>零;//3
四 = 加=>加=>加=>加=>零;//4
五 = 加=>加=>加=>加=>加=>零;//5
加(三,二);
((數(shù)一,數(shù)二) =>?
????如果(為零(數(shù)二)
??????,數(shù)一
??????,加(后繼(數(shù)一),前繼(數(shù)二))
????))(三,二);
如果(為零(二)
??,三
??,加(后繼(三),前繼(二))
);
加(后繼(三),前繼(二));
加(四,一);
((數(shù)一,數(shù)二) =>?
????如果(為零(數(shù)二)
??????,數(shù)一
??????,加(后繼(數(shù)一),前繼(數(shù)二))
????))(四,一);
如果(為零(一)
??,四
??,加(后繼(四),前繼(一))
);
加(后繼(四),前繼(一));
加(五,零);
((數(shù)一,數(shù)二) =>?
????如果(為零(數(shù)二)
??????,數(shù)一
??????,加(后繼(數(shù)一),前繼(數(shù)二))
????))(五,零);
如果(為零(零)
??,五
??,加(后繼(五),前繼(零))
);
如果(真
??,五
??,加(后繼(五),前繼(零))
);
如果(為零(零)
??,五
??,加(后繼(五),前繼(零))
);
//加(后繼(五),前繼(零),依然會被執(zhí)行
加(后繼(五),前繼(零));
((數(shù)一,數(shù)二) =>?
????如果(為零(數(shù)二)
??????,數(shù)一
??????,加(后繼(數(shù)一),前繼(數(shù)二))
????))(六,前繼(零));
如果(為零(前繼(零))
????,六
????,加(后繼(六),前繼(前繼(零)))
??)
加(后繼(后繼(五)),前繼(前繼(零)));
加(后繼(后繼(后繼(五))),前繼(前繼(前繼(零))));
// 發(fā)生了什么...
// 永遠執(zhí)行下去
// 7.重新定義真假,如果
如果(真, 五, 加(后繼(五),前繼(零)));
真 = (選擇一,選擇二)=>選擇一;
假 = (選擇一,選擇二)=>選擇二;
// 使得第二個參數(shù)不要被調用
真(五,加(后繼(五),前繼(零)));
(懶惰執(zhí)行)=>加(后繼(五),前繼(零));
真((懶惰執(zhí)行)=>五,(懶惰執(zhí)行)=>加(后繼(五),前繼(零)));
(懶惰執(zhí)行)=>五;
真 = (選擇一,選擇二)=>選擇一(零);
真(()=>五,()=>加(后繼(五),前繼(零)));
真 = (選擇一,選擇二)=>選擇一();
真(()=>五,()=>加(后繼(五),前繼(零)));
(()=>五)()
五
// ((懶惰執(zhí)行)=>加(后繼(五),前繼(零)))(零)
// 加(后繼(五),前繼(零))
真 = (選擇一,選擇二)=>選擇一();
假 = (選擇一,選擇二)=>選擇二();
// 選擇一?
// 選擇二
// 都需要懶惰執(zhí)行,()=>
// 以前好多函數(shù)都要重新定義...
如果 = (條件,選擇一,選擇二)=>條件(選擇一,選擇二);
// 3.1.真值表
非 = (條件)=>如果(條件,()=>假,()=>真);
非(真);//假
非(假);//真
// 3.2.或,條件一,條件二任意一個真,那么為真,否則為假
或 = (條件一,條件二) =>
??如果(條件一,()=>真,()=>如果(條件二,()=>真,()=>假));
或(真,真);//真
或(真,假);//真
或(假,真);//真
或(假,假);//假
// 3.2.與,條件一,條件二都為真,那么為真,否則為假
與 = (條件一,條件二) =>?
????如果(條件一,()=>如果(條件二,()=>真,()=>假),()=>假)
與(真,真);//真
與(真,假);//假
與(假,真);//假
與(假,假);//假
// 7.定義加減乘,相等,大于,小于
加 = (數(shù)一,數(shù)二) =>?
????如果(為零(數(shù)二)
??????,()=>數(shù)一
??????,()=>加(后繼(數(shù)一),前繼(數(shù)二))
????);
減 = (數(shù)一,數(shù)二) =>
????如果(為零(數(shù)二)
??????,()=>數(shù)一
??????,()=>減(前繼(數(shù)一),前繼(數(shù)二))
????);
為一 = (自然數(shù)) => 如果(為零(自然數(shù))
????,()=>假
????,()=>如果(為零(前繼(自然數(shù)))
??????????,()=>真
??????????,()=>假)
???);
乘非零 = (數(shù)一,數(shù)二) =>
??????如果(為一(數(shù)二)
??????,()=>數(shù)一
??????,()=>乘非零(加(數(shù)一,數(shù)一),減(數(shù)二,一))
????);
乘 = (數(shù)一,數(shù)二) =>
????如果(為零(數(shù)二)
??????,()=>零
??????,()=>乘非零(數(shù)一,數(shù)二)
????);
相等=(數(shù)一,數(shù)二)=>如果(
????????與(為零(減(數(shù)一,數(shù)二)),
?????????為零(減(數(shù)二,數(shù)一)))
???????,()=>真
???????,()=>假);
小于=(數(shù)一,數(shù)二) => 如果(
????????與(為零(減(數(shù)一,數(shù)二)),
?????????非(為零(減(數(shù)二,數(shù)一))))
??????,()=>真
??????,()=>假);
大于=(數(shù)一,數(shù)二) => 如果(
????????與(非(為零(減(數(shù)一,數(shù)二))),
?????????為零(減(數(shù)二,數(shù)一)))
??????,()=>真
??????,()=>假);
// 斐波那契數(shù)
// 第一個月初有一對剛誕生的兔子
// 第二個月之后(第三個月初)它們可以生育
// 每月每對可生育的兔子會誕生下一對新兔子
// 兔子永不死去
// 過了100個月,總計有多少兔子?
//1,1,2,3,5,8,13,……,斐(第88個月),斐(第89個月),斐(第88個月)+斐(第89個月),
斐波那契數(shù) = (第幾個月) =>?
????如果(或(為零(第幾個月),為一(第幾個月)),
??????()=>一,
??????()=>加(斐波那契數(shù)(減(第幾個月,一))
?????????,斐波那契數(shù)(減(第幾個月,二)))
????);