Чтение онлайн

на главную

Жанры

Неизвестно

Шрифт:

принадлежит( X, L)

где Х - объект, а L - список. Цель принадлежит( X, L) истинна, если элемент Х встречается в L. Например, верно что

принадлежит( b, [а, b, с] )

и, наоборот, не верно, что

принадлежит b, [а, [b, с] ] )

но

принадлежит [b, с], [а, [b, с]] )

истинно. Составление программы для отношения принадлежности может быть основано на следующих соображениях:

(1) Х

есть голова L, либо

(2) Х принадлежит хвосту L.

Это можно записать в виде двух предложений, первое из которых есть простой факт, а второе - правило:

принадлежит( X, [X | Хвост ] ).

принадлежит ( X, [Голова | Хвост ] ) :-

принадлежит( X, Хвост).

3. 2. 2. Сцепление ( конкатенация)

Для сцепления списков мы определим отношение

конк( L1, L2, L3)

Здесь L1 и L2 - два списка, a L3 - список, получаемый при их сцеплении. Например,

конк( [а, b], [c, d], [a, b, c, d] )

истинно, а

конк( [а, b], [c, d], [a, b, a, c, d] )

ложно. Определение отношения конк, как и раньше, содержит два случая в зависимости от вида первого аргумента L1:

(1) Если первый аргумент пуст, тогда второй и третий аргументы представляют собой один и тот же список (назовем его L), что выражается в виде следующего прологовского факта:

конк( [ ], L, L ).

(2) Если первый аргумент отношения конк не пуст, то он имеет голову и хвост в выглядит так:

[X | L1]

На рис. 3.2 показано, как производится сцепление списка [X | L1] с произвольным списком L2. Результат сцепления - список [X | L3], где L3 получен после сцепления списков L1 и L2. На прологе это можно записать следующим образом:

конк( [X | L1, L2, [X | L3]):-

конк( L1, L2, L3).

Рис. 3. 2. Конкатенация списков.

Составленную программу можно теперь использовать для сцепления заданных списков, например:

?- конк( [a, b, с], [1, 2, 3], L ).

L = [a, b, c, 1, 2, 3]

?- конк( [а, [b, с], d], [а, [ ], b], L ).

L = [a, [b, c], d, а, [ ], b]

Хотя программа для конк выглядит довольно просто, она обладает большой гибкостью и ее можно использовать

многими другими способами. Например, ее можно применять как бы в обратном направлении для разбиения заданного списка на две части:

?- конк( L1, L2, [а, b, с] ).

L1 = [ ]

L2 = [а, b, c];

L1 = [а]

L2 = [b, с];

L1 = [а, b]

L2 = [c];

L1 = [а, b, с]

L2 = [ ];

no (нет)

Список [а, b, с] разбивается на два списка четырьмя способами, и все они были обнаружены нашей программой при помощи механизма автоматического перебора.

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

?- конк( До, [май | После ],

[янв, фев, март, апр, май, июнь,

июль, авг, сент, окт, ноябрь, дек]).

До = [янв, фев, март, апр]

После = [июнь, июль, авг, сент, окт, ноябрь, дек].

Далее мы сможем найти месяц, непосредственно предшествующий маю, и месяц, непосредственно следующий за ним, задав вопрос:

?- конк( _, [Месяц1, май, Месяц2 | _ ],

[янв, февр, март, апр, май, июнь,

июль, авг, сент, окт, ноябрь, дек]).

Месяц1 = апр

Месяц2 = июнь

Более того, мы сможем, например, удалить из некоторого списка L1 все, что следует за тремя последовательными вхождениями элемента z в L1 вместе с этими тремя z. Например, это можно сделать так:

?- L1 = [a, b, z, z, c, z, z, z, d, e],

конк( L2, [z, z, z | _ ], L1).

L1 = [a, b, z, z, c, z, z, z, d, e]

L2 = [a, b, z, z, c]

Мы уже запрограммировали отношение принадлежности. Однако, используя конк, можно было бы определить это отношение следующим эквивалентным способом:

принадлежит1( X, L) :-

Поделиться:
Популярные книги

Принцы демонов. Умирающая Земля. Хроники Кадвола. Планета приключений. Книги 1 - 16

Вэнс Джек Холбрук
Планета приключений
Фантастика:
научная фантастика
5.00
рейтинг книги
Принцы демонов. Умирающая Земля. Хроники Кадвола. Планета приключений. Книги 1 - 16

Сборник рассказов

Андреев Леонид Николаевич
Проза:
классическая проза
русская классическая проза
5.00
рейтинг книги
Сборник рассказов

Ваш ребенок

Сирс Уильям
Дом и Семья:
прочее домоводство
6.25
рейтинг книги
Ваш ребенок

"Фантастика 2023-129". Компиляция. Книши 1-20

Поселягин Владимир Геннадьевич
Фантастика 2023. Компиляция
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2023-129. Компиляция. Книши 1-20

Собрание сочинений. Том третий

Гашек Ярослав
3. Ярослав Гашек. Собрание сочинений в 6-ти томах
Юмор:
юмористическая проза
5.00
рейтинг книги
Собрание сочинений. Том третий

Иван Болотников

Замыслов Валерий Александрович
Проза:
историческая проза
5.00
рейтинг книги
Иван Болотников

Эммануэль

Арсан Эммануэль
1. Эммануэль
Любовные романы:
эро литература
7.38
рейтинг книги
Эммануэль

Гримуар темного лорда IX

Грехов Тимофей
9. Гримуар темного лорда
Фантастика:
попаданцы
альтернативная история
аниме
фэнтези
5.25
рейтинг книги
Гримуар темного лорда IX

От Второй мировой к холодной войне. Немыслимое

Никонов Вячеслав
Научно-образовательная:
история
5.00
рейтинг книги
От Второй мировой к холодной войне. Немыслимое

Дорога в рай

Юмор:
юмористическая проза
5.00
рейтинг книги
Дорога в рай

Стражи Хейвена

Грин Саймон
Фантастика:
героическая фантастика
7.00
рейтинг книги
Стражи Хейвена

Птицелов

Остапенко Юлия Владимировна
Фантастика:
фэнтези
7.43
рейтинг книги
Птицелов

Портрет моего мужа

Демина Карина
Фантастика:
детективная фантастика
5.75
рейтинг книги
Портрет моего мужа

Неучтенный элемент. Том 5

NikL
5. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 5