如何处理prolog列表?

时间:2012-01-12 23:30:26

标签: prolog prolog-toplevel

我有谓词{{​​1}},我希望它返回它所需的列表。 代码是这样的:

m(L,L)

当我尝试在这个例子中使用它时:

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

我得到了这个答案:

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

(我注意到如果我用较少的元素尝试它就可以了。)为什么会发生这种情况并且列表未完成?

我该如何避免这种情况?

很抱歉,如果这是一个非常愚蠢的问题,但我搜索了网页,我找不到任何可以帮助我理解的文档...... 谢谢!

2 个答案:

答案 0 :(得分:4)

列表已完成 - 输出正在被截断以用于可视化目的。如果你编写一个打印出你的列表的谓词,你会发现它已经完成了。我猜你正在使用SWI prolog,这意味着你可以查看this link有关更改显示设置的方法。

答案 1 :(得分:0)

作为调试器的顶层查询/应答循环都缩写了长复杂的术语。他们这样做是为了避免无休止的输出页面。实际上,他们使用write_term/3来编写,它将选项列表作为参数。 Prolog toplevel打印的答案的选项列表位于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)].

要更改默认设置: 在prolog个人初始化文件中添加set_prolog_flag / 2指令(参见PlInitialisation)以更改上述prolog标志的默认值。

转到settings -> user init file ... ->

并像这样更改max_depth(10):

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

您还可以在已经评论过的 PlInitialisation 文件中使用其他选项。