как обрабатывать списки пролога?

У меня есть предикат 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|...].

(Я заметил, что если я попробую с меньшим количеством элементов, все будет в порядке.) Почему это происходит, а список не завершен?

Как я могу этого избежать?

Извините, если это действительно глупый вопрос, но я искал в Интернете и не смог найти никакой документации, которая могла бы помочь мне понять... Спасибо!


person user1146636    schedule 12.01.2012    source источник
comment
Пожалуйста, отформатируйте код в следующий раз.   -  person Carl Norum    schedule 13.01.2012
comment
Ваша программа правильная. Это похоже на проблему форматирования в вашей среде Prolog, где длинные списки укорачиваются для целей отображения.   -  person Sergey Kalinichenko    schedule 13.01.2012


Ответы (2)


Список закончен - вывод просто усекается для целей визуализации. Если вы напишете предикат, выводящий список, вы увидите, что он завершен. Я предполагаю, что вы используете пролог SWI, что означает, что вы можете проверить эту ссылку, чтобы узнать, как изменить настройки отображения.

person Carl Norum    schedule 12.01.2012
comment
Нет проблем — просто примите ответ, как только истечет время ожидания! - person Carl Norum; 13.01.2012

И цикл запроса/ответа верхнего уровня, и отладчик сокращают длинные сложные термины. Они делают это, чтобы избежать бесконечных страниц вывода. На самом деле они пишут, используя write_term/3, который принимает параметр -список в качестве аргумента. Список опций для ответов, напечатанных верхним уровнем Пролога, находится в пролог-флаге 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 в ваш персональный файл инициализации prolog (см. ), чтобы изменить установленные по умолчанию вышеупомянутые флаги пролога.

Просто зайдите в settings -> user init file ... ->

И измените max_depth(10) следующим образом:

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

Существуют и другие параметры, которые вы можете использовать в файле PlInitialisation. которые уже прокомментированы.

person Ali Nfr    schedule 28.12.2014