2010-04-11 81 views
0

我知道如何使用loop來顯示列表。 例如,除了使用循環之外,是否還有其他方式顯示列表?

choice(a):-write('This is the top 15 countries list:'),nl, 
loop(X). 

loop(X):-country(X),write(X),nl,fail. 

不幸的是,我不知道如何使用list顯示列表上。任何人都可以指導我?

+6

這是Prolog嗎?你有它的標籤爲PHP – 2010-04-11 08:08:10

+0

問題:你的第一條規則的頭是不變的:它只定義了原子'a'的'choice'謂詞的含義,並且在子句'loop(X)',X '沒有約束,所以這不是一個合理的規則。 – 2010-04-13 07:32:00

回答

4

這是不是很清楚你試圖實現什麼。

從您的描述中我不確定您是否完全理解了Prolog的聲明式風格。當您爲loop編寫規則時,您提供了一組條件,在該條件下Prolog將與該規則匹配。這與一套程序性指示不同。

如果要收集所有國家到列表中,你可以使用setof規則如下一樣

top_countries(Cs):- 
    setof(C, country(C), Cs). 

這將返回[]由該規則匹配的國家名單。

如果你想在新行上輸出這個列表的每個元素,你可以做類似下面的遞歸函數。

write_list([]). 
write_list([H|T]):- 
     write(H),nl, 
    write_list(T). 

第一規則的基礎情況匹配;這是當列表中沒有元素時。在這一點上,我們應該匹配並停止。第二條規則匹配(統一)列表的,並在後面用換行符將其寫入屏幕。最後一行將列表的尾部(餘數)再次與write_list函數相結合。

你喜歡的東西下面

choice(a):- 
    write('This is the top 15 countries list:'),nl, 
    top_countries(X), 
    write_list(X). 

需要注意的事項可以據此把它們串起來 儘量不要有變量,比如在你的選擇規則的X.變量可以統一(匹配)某些東西。 看看良好的聲明式編程風格。當你使用像write這樣的函數時,它可能會讓人產生誤解並且很容易以程序的方式對待Prolog,但這隻會給你帶來問題。

希望這有助於

0

write/1並不只寫字符串,它寫入任何Prolog項。所以,雖然Oli給出了一個更漂亮的write_list,但下面的工作可以完成:

 
choice(Countries):-write('This is the top 15 countries list:'),nl,write(Countries). 
相關問題