Как справиться с списками прологов?
-
27-10-2019 - |
Вопрос
У меня есть предикат 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|...].
(Я заметил, что если я попробую с меньшим количеством элементов, все в порядке.) Почему это происходит, а список неверен?
Как я могу этого избежать?
Извините, если это действительно глупый вопрос, но я искал в Интернете, и я не мог найти никакой документации, которая может помочь мне понять ... спасибо!
Решение
Список закончен - вывод только усекается для целей визуализации. Если вы напишите предикат, который распечатает ваш список, вы увидите, что он завершен. Я предполагаю, что вы используете SWI Prolog, что означает, что вы можете проверить эта ссылка Для способов изменить настройки дисплея.
Другие советы
Оба Toplevel Requery/ответный цикл в качестве отладчика сокращает длинные сложные термины. Они делают это, чтобы избежать бесконечных страниц вывода. На самом деле они пишут, используя write_term/3 который принимает список вариантов в качестве аргумента. Список опций для ответов, напечатанных Prologovevel, находится в 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 в свой файл личной инициализации Prolog (см. Плинилизация) изменить по умолчанию вышеупомянутые флаги пролога.
Просто пойти в settings -> user init file ... ->
И изменить max_depth (10)
:- set_prolog_flag(toplevel_print_options,
[quoted(true), portray(true), max_depth(100)]).
Есть и другие варианты, которые вы можете использовать в Плинилизация Файл, который уже прокомментирован.