2011-05-16 40 views
1

定義列表:

nat2::[(Integer, Integer)] 

包含所有對由康托爾定理的證明知 關係有序非負整數 的:NAT2 :: [(整數,整數)定義

(x1,y1) < (x2,y2) <=> x1+y1 < x2+y2 v (x1+y1=x2+y2^x1 < x2) 

[^ - 意味着替代]

使得:

nat2 = [(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(0,3),(1,2),(2,1),(3,0),...] 

提示:

定義應該適合在一個 線和短於45個 字符。請注意, 相同對角線上的點的座標總和爲 是恆定的。

我做了一些定義,但我不知道這是否是正確的,你可以檢查/維修/給出提示:

nat2::[(Integer,Integer)] 
nat2=[(a,b-a)|b<-[0...],a<-[0...b]] 

編輯:改爲:

nat2 :: [(Integer,Integer)] 
nat2 = [(a,b-a) | b <- [0..], a <- [0..b]] 

與結果:

Prelude> :load "nat2.hs" 
[1 of 1] Compiling Main    (nat2.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> take 10 nat2 
[(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(0,3),(1,2),(2,1),(3,0)] 
+1

該代碼甚至沒有編譯,因此它是不正確的。在詢問我們是否正確之前,請嘗試在ghci中運行您的代碼。 – 2011-05-16 17:15:00

+0

現在它工作,更新問題 – Tom 2011-05-16 17:26:38

+0

爲什麼所有這些downvotes? OP顯示了一個問題,張貼了他所做的並尋求幫助。我看不出投票的理由。順便說一句,你可以通過用四個空格縮進來將代碼格式化爲代碼。你甚至可以嵌套引號和代碼。 (我以前不知道這個;) – fuz 2011-05-16 17:46:58

回答

4

你有一個語法錯誤(你嘗試運行我T和檢查輸出)

Prelude> [(a,b-a)|b<-[0...],a<-[0...b]] 

<interactive>:1:14: 
    A section must be enclosed in parentheses thus: (0 ...) 

因爲你只需要在列表枚舉2 ..

Prelude> take 10 [(a,b-a)|b<-[0..],a<-[0..b]] 
[(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(0,3),(1,2),(2,1),(3,0)]  

看起來合理,但你是最好的判斷。

+0

nat2 :: [(Integer,Integer)] nat2 = [(x,s-x) s < - [0 ..],x < - [0..s]] 這是一個作品,稱爲:採取10 nat2 – Tom 2011-05-16 17:25:28

+0

是的我犯了語法錯誤,而在這裏寫....ryry。 好ver。在編輯問題後更新。 – Tom 2011-05-16 17:34:39