Разница между "открытыми списками" и "списками различий"

В чем разница между "открытыми списками" и "списками различий"?

3 ответа

Решение

Оба понятия кажутся списками, но на самом деле это не так. Один - конкретный термин, другой - скорее конвенция.

Открытые списки, частичные списки

Открытые списки - это термины, которые не являются списками, но могут быть созданы так, что они становятся списками. В стандартном жаргоне они называются частичными списками. Вот частичные списки: X, [a|X], [X|X] все частичные списки.

Понятие открытых списков предполагает определенное использование таких списков для имитации некоторого открытого состояния. Подумайте о словаре, который может быть представлен открытым списком. Каждый раз, когда вы добавляете новый элемент, переменная "в конце частичного списка" создается для нового элемента. Хотя эта техника программирования вполне возможна в Прологе, у нее есть один большой недостаток: программы будут сильно зависеть от процедурной интерпретации. И во многих ситуациях вообще невозможно иметь декларативное толкование.

Списки различий

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

Рассматривать:

el(E, [E|L],L).

Здесь последние два аргумента можно рассматривать как формирующие разницу: список, содержащий единственный элемент [E], Теперь вы можете создавать более сложные списки из более простых, если вы соблюдаете определенные соглашения, которые, по сути, заключаются в том, что второй аргумент только передается дальше. Различия как таковые никогда не сравниваются друг с другом!

el2(E, F, L0,L) :-
   el(E, L0,L1),
   el(F, L1,L).

Обратите внимание, что это просто соглашение. Списки не применяются. Думать о:

?- el2(E, F, L, nonlist).
L = [E,F|nonlist].

Этот метод также используется для кодирования DCG.

Как описано на http://homepages.inf.ed.ac.uk/pbrna/prologbook/node180.html, открытый список - это инструмент, используемый для реализации списка различий.

Открытый список - это любой список, в котором у вас есть неназначенная переменная в некоторой точке списка, например: [a,b,c|X], Вы можете использовать открытый список для реализации структуры данных, называемой списком различий, которая формально задает структуру из двух терминов, указывающих на первый элемент и на открытый конец, традиционно определяемых как: [a,b,c|X]-X, чтобы сделать работу с такими списками проще.

Например, если у вас есть только открытый список, добавление элемента в конец возможно, но вам нужно перебрать все элементы. В списке различий вы можете просто использовать переменную конца списка (называемую Hole на странице выше), чтобы пропустить итерацию и выполнить операцию в постоянное время.

Например

Открытый: [a,b,c | _]

Список различий: [a,b,c|U]-U.

Другие вопросы по тегам