2012-01-12 91 views
3

我有謂詞m(L,L),我希望它返回它需要的列表。 的代碼是這樣的:如何處理prolog列表?

m([],[]). 
m([H|T],[H|L]) :- m(T,L). 

當我嘗試用這個例子中使用它:

m([1,2,3,4,5,6,7,8,9,10],L) 

我得到這樣一個答案:

L = [1, 2, 3, 4, 5, 6, 7, 8, 9|...]. 

(我注意到,如果我爲什麼會發生這種情況並且列表未完成?

我該如何避免這種情況?

對不起,如果它是一個非常愚蠢的問題,但我已經在網上搜索,我找不到任何可以幫助我理解的文檔... 謝謝!

+0

下次請格式化您的代碼。 – 2012-01-12 23:32:27

+1

你的程序是正確的。它看起來像一個在你的Prolog環境中的格式化問題,它縮短了長列表的顯示目的。 – dasblinkenlight 2012-01-12 23:35:55

回答

4

該列表已完成 - 輸出僅被截斷以實現可視化目的。如果您編寫一個打印列表的謂詞,您會發現它已完成。我猜你正在使用SWI prolog,這意味着你可以查看this link來改變顯示設置。

+0

非常感謝。你是完全正確的。這是SWI prolog's .. – user1146636 2012-01-12 23:45:01

+0

沒問題 - 只要你的超時時間結束就接受答案! – 2012-01-12 23:51:08

0

作爲調試器的頂級查詢/回答循環縮短了長複雜的術語。他們這樣做是爲了避免無盡的輸出頁面。實際上,他們使用write_term/3編寫,它以選項列表作爲參數。由Prolog頂層打印的答案的選項列表位於prolog-flag toplevel_print_options中,調試器的選項列表位於debugger_print_options中。最初都具有價值如下:

?- current_prolog_flag(toplevel_print_options, X). 

X = [quoted(true), portray(true), max_depth(10), spacing(next_argument)]. 

要更改默認設置: 添加set_prolog_flag/2指令在序言個人的初始化文件(見PlInitialisation)更改默認上述序言標誌。

只要進入settings -> user init file ... ->

而變化MAX_DEPTH(10)所示:

:- set_prolog_flag(toplevel_print_options, 
      [quoted(true), portray(true), max_depth(100)]). 

還有其他的選擇,你可以在那些已經評論PlInitialisation文件中使用。