經(jīng)過這一段時間對概念文字勃教,遞歸函數(shù),lambda演算和組合子邏輯的研究脐嫂,我發(fā)現(xiàn)了一種新的表示方法统刮,這種表示法紊遵,可以通過生成上下文,來控制符號的含義侥蒙,這個基本的思想可以追溯到哲學(xué)對于概念的思考暗膜,我們的文字和自然語言,都具有上下文鞭衩,用一個符號指代在上文中出現(xiàn)的概念学搜,那么這個符號本身就是上下文相關(guān)的,在編程語言中论衍,因為符號無法被重用恒水,會導(dǎo)致沖突,但是饲齐,我注意到有一些編程語言,比如著名的APL和J語言咧最,具有上下文捂人,它使用了隱式符號,來避免了這種沖突矢沿,但是我在研究smalltalk的時候滥搭,也發(fā)現(xiàn)它具有生成新對象的語義,這個新的對象捣鲸,不就是一個語義嘛瑟匆,當我想到這里的時候,頓時覺得栽惶,用函數(shù)生成具有新的上下文的函數(shù)愁溜,不就是一個新的對象,一個新的概念外厂,而且我們可以使用范疇來控制它的語義冕象,也就是集合的運算,來指定符號的范圍汁蝶,這樣可以大大減少新符號的使用渐扮,而且,我們的語義更加精確掖棉,因為集合的明確抽象墓律,可以避免模糊的語義,一切函數(shù)都可以進行集合推斷幔亥,從而判斷它的類型耻讽,這不就是最基本的邏輯推理嗎?要么定義范圍紫谷,要么定義內(nèi)涵齐饮。而且可以運用某些測試函數(shù)來自動推理范圍捐寥,這個我還在研究當中。下面給出一個人類推理的過程祖驱。
一類物體的大量現(xiàn)象 => 一般的類 => 根據(jù)某些性質(zhì)判斷類型 => 得出普遍的性質(zhì)握恳。
《九章算術(shù)》也寫道:“事有相推,各有攸歸捺僻,故枝條雖分而本干知乡洼,發(fā)其一端而已”。
這里面涉及到充分條件匕坯,必要條件的確定束昵,我們就不細說了,但是這個過程無疑是對的葛峻。
我們的編程語言具有這樣的能力锹雏,首先,我們可以生成新的上下文术奖。
1+ 1 = 2
1 + 1 = 1+ 1 = 2
//注意礁遵,這里的1 + 1后面兩個字符表示“加1”,“1”這個概念和“+”這個概念生成了“加1”這個概念采记。
這樣無限地遞歸下去佣耐。
true 1 2 = 1
false 1 2 = true 2 = 2
首先我們的true把第一個元素拿出來,false先生成一個true唧龄,然后直接取出來兼砖。
其他的具體就不描述了,下面直接上代碼既棺。
(define (array x)
(define (gen-compare x c n)
(if (null? x) '()
(if (c (car x) n)
(cons (car x) (gen-compare (cdr x) c n))
(gen-compare (cdr x) c n))))
(define (gen-add x add n res)
(if (null? x)
(if (null? n) (array (reverse res))
(gen-add x add (cdr n) (cons (car n) res)))
(gen-add (cdr x) add n (cons (car x) res))))
(define (qst arr)
(if (arr = null?) null-arr
((qst ((arr cdr) <= (arr car))) +
((array (list (arr car))) +
(qst ((arr cdr) > (arr car)))))))
(lambda (f . n)
(cond
((compare > f) (array (gen-compare x f (car n))))
((eq? f +) (gen-add x + ((car n) =) '()))
((eq? f car) (car x))
((eq? f cdr) (array (cdr x)))
((eq? f sort) (qst (array x)))
((eq? f =)
(if (null? n)
x
(if (eq? (car n) null?)
(null? x))))
(else 'err))))
(define c (array '(1 3 5 7 9)))
(define d (array '(2 4 6 8 10)))
(define f (array '(1 7 8 2 4)))
((c > 2) =)
((c + d) =)
((c + (d + (d + c))) =)
(define null-arr (array '()))
(c = null?)
((f sort) =)
(null-arr =)
(null-arr = null?)
(define (set x)
(define (belong-to? x n)
(if (null? x) #f
(if (eq? (if (procedure? n) (eval (car x) user-initial-environment) (car x)) n) #t
(belong-to? (cdr x) n))))
(define (add-set all self n res)
(if (null? (self =))
(if (null? (n =)) (set (((array res) sort) =))
(add-set all self (n cdr)
(if (all < (n car)) (cons (n car) res) res) ))
(add-set all (self cdr) n (cons (self car) res))))
(define (include? self n)
(if (null? (n =)) #t
(if (self < (n car)) #f
(include? self (n cdr)))))
(define self
(lambda (f . n)
(cond
((eq? f +) (add-set self self (car n) '()))
((eq? f >) (belong-to? x (car n)))
((eq? f <) (not (belong-to? x (car n))))
((eq? f >=) (include? self (car n)))
((eq? f <=) (not (include? self (car n))))
((eq? f =) x)
((eq? f car) (car x))
((eq? f cdr) (set (cdr x) ))
(else 'err))))
self)
(define a (set '(1 2 3)))
(a >= (set '(1 4)))
((a + (set '(2 3 4))) =)
(((set '(1 2 3 6 9 10)) + (set '(2 5 10 13 27))) =)
(a > 1)
(a < 4)
(define compare (set '(> < <= >=)))
(compare > <=)
這里分別定義了兩個類讽挟,一個是array類,一個是set類丸冕,它們雖然具有很多完全相同的符號戏挡,但是因為函數(shù)生成了新的語義,也就是新的函數(shù)和上下文晨仑,所以它們根本不會沖突褐墅,這樣的編寫方式非常優(yōu)雅。