3

我有谓词m(L,L),我希望它返回它需要的列表。代码是这样的:

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|...].

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

我怎样才能避免这种情况?

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

4

2 回答 2

4

列表已完成 - 输出只是为了可视化目的而被截断。如果您编写一个打印出您的列表的谓词,您会看到它是完整的。我猜您正在使用 SWI prolog,这意味着您可以查看此链接以了解更改显示设置的方法。

于 2012-01-12T23:36:50.637 回答
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文件中使用其他选项。

于 2014-12-28T08:32:14.570 回答