如何处理Prolog列表?

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

我注意到如果我试着减少元素,它就可以正常工作。为什么会发生这种情况,而列表却没有完成?

我该如何避免这种情况?

如果我的问题很愚蠢,对不起。但我已经在网上搜索了很多文档,也找不到能帮助我理解的资料...谢谢!


请下次格式化您的代码。 - Carl Norum
1
你的程序是正确的。看起来是在你的Prolog环境中出现了格式问题,导致长列表被缩短以便于显示。 - Sergey Kalinichenko
2个回答

4
列表已完成 - 输出仅为可视化目的而被截断。如果编写一个打印列表的谓词,您将看到它是完整的。我猜你正在使用SWI Prolog,这意味着您可以查看this link以了解如何更改显示设置。

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

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

只需转到设置 -> 用户初始文件... ->

然后像这样更改max_depth(10):

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

PlInitialisation 文件中,还有其他已经被注释的选项可供使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接