2011-06-07 36 views
2

大家好,我再次來這裏,這一週,我得到這個作業:水仙花數在序言

我應該找到所有1010000具有類似於下面的示例屬性之間的數字:

89 = 8^1 + 9^2 
2427 = 2^1 + 4^2 + 2^3 + 7^4 = 2 + 16 + 8 + 2401 

我有這個在Haskell實現的,它工作得很好(我認爲),並返回一個像這樣的列表:

[89,135,175,518,598,1306,1676,2427] 

,然後我試着寫P中rolog(如需要太多)像下面這樣:

num(0). 
num(1). 
num(2). 
num(3). 
num(4). 
num(5). 
num(6). 
num(7). 
num(8). 
num(9). 

allNarc(X):- num(A),num(B),num(C),num(D), 
      X = A*1000+B*100+C*10+D,Y = A**1+B**2+C**3+D**4, 
      X =:= Y,X>10. 
allNarc(X):- num(B),num(C),num(D), 
      X = B*100+C*10+D,Y = B**1+C**2+D**3, 
      X =:= Y,X>10. 
allNarc(X):- num(C),num(D), 
      X = C*10+D,Y = C**1+D**2, 
      X =:= Y,X>10. 

的結果是這樣的:

?- allNarc(X). 
X = 1*1000+3*100+0*10+6 ; 
X = 1*1000+6*100+7*10+6 ; 
X = 2*1000+4*100+2*10+7 ; 
X = 0*100+4*10+3 ; <- 43 
X = 0*100+6*10+3 ; <- 63 
X = 1*100+3*10+5 ; 
X = 1*100+7*10+5 ; 
X = 5*100+1*10+8 ; 
X = 5*100+9*10+8 ; 
X = 8*10+9 ; 
false. 

明確4364不應該屬於這個羣體,其結果僅僅是難看,任何人都可以幫助我在Haskell實現中獲得輸出結果?

回答

3

兩點。

  1. 當你說X =你是統一的=的左側和右側。如果您希望X是一個等於評估表達式的數字,請使用X is <expression here>
  2. 要防止零在第一位置:num(A), A \= 0, num(B), ...

做出這些改變,我得到後:

?- allNarc(X). 
X = 1306 ? ; 
X = 1676 ? ; 
X = 2427 ? ; 
X = 135 ? ; 
X = 175 ? ; 
X = 518 ? ; 
X = 598 ? ; 
X = 89 ? ; 
no 

你也可以使用bagof收集值。例如bagof(X,allNarc(X),Narcs).Narcs是您的值的列表。

+0

嘿非常感謝,我只是自己想出了這件事。我更喜歡使用'setof'來得到像我的haskell程序一樣的確切列表。 – bearzk 2011-06-07 22:23:22

2

您需要:

  1. 防止第一位數爲0。
  2. 確保X進行評估,以你想要的值。目前您使用的術語統一不合適,您需要使用is關鍵字。

參見:

num(0). 
num(1). 
num(2). 
num(3). 
num(4). 
num(5). 
num(6). 
num(7). 
num(8). 
num(9). 
posnum(A) :- num(A), A \= 0. 

allNarc(X):- posnum(A),num(B),num(C),num(D), 
      X is A*1000+B*100+C*10+D,Y is A**1+B**2+C**3+D**4, 
      X =:= Y,X>10. 
allNarc(X):- posnum(B),num(C),num(D), 
      X is B*100+C*10+D,Y is B**1+C**2+D**3, 
      X =:= Y,X>10. 
allNarc(X):- posnum(C),num(D), 
      X is C*10+D,Y is C**1+D**2, 
      X =:= Y,X>10. 

注意,您可以接着使用setof找到所有的數字:

?- setof(X,allNarc(X),XL). 
XL = [89, 135, 175, 518, 598, 1306, 1676, 2427]. 

這是更爲方便的是通過他們列出一個接一個。

+1

嘿謝謝:)我發現,我應該防止像'43 = 0^1 + 4^2 + 3^3'這樣的事情從我的結果,這導致你的解釋'1.' btw我寧願使用' B) – bearzk 2011-06-07 22:27:43

+0

固定!我已經完成了任何序言已經有一段時間了,所以我忘記了'setof' :)。 – MGwynne 2011-06-07 22:31:11