我知道如何使用loop
來顯示列表。 例如,除了使用循環之外,是否還有其他方式顯示列表?
choice(a):-write('This is the top 15 countries list:'),nl,
loop(X).
loop(X):-country(X),write(X),nl,fail.
不幸的是,我不知道如何使用list
顯示列表上。任何人都可以指導我?
我知道如何使用loop
來顯示列表。 例如,除了使用循環之外,是否還有其他方式顯示列表?
choice(a):-write('This is the top 15 countries list:'),nl,
loop(X).
loop(X):-country(X),write(X),nl,fail.
不幸的是,我不知道如何使用list
顯示列表上。任何人都可以指導我?
這是不是很清楚你試圖實現什麼。
從您的描述中我不確定您是否完全理解了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,但這隻會給你帶來問題。
希望這有助於
write/1
並不只寫字符串,它寫入任何Prolog項。所以,雖然Oli給出了一個更漂亮的write_list,但下面的工作可以完成:
choice(Countries):-write('This is the top 15 countries list:'),nl,write(Countries).
這是Prolog嗎?你有它的標籤爲PHP – 2010-04-11 08:08:10
問題:你的第一條規則的頭是不變的:它只定義了原子'a'的'choice'謂詞的含義,並且在子句'loop(X)',X '沒有約束,所以這不是一個合理的規則。 – 2010-04-13 07:32:00