как обрабатывать списки прологов? - PullRequest
3 голосов
/ 13 января 2012

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 13 января 2012

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

0 голосов
/ 28 декабря 2014

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

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

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

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

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

...