Составители:
Рубрика:
105
5.5.1 Поиск элемента в списке
Поиск элемента в списке является очень распространенной операцией.
Поиск представляет собой просмотр списка на предмет выявления соответст-
вия между элементом данных (объектом поиска) и элементом просматри-
ваемого списка. Если такое соответствие найдено, то поиск заканчивается
успехом. В противном случае поиск заканчивается неуспехом. Результат по-
иска, так же как и результат
любой другой операции Турбо-Пролога, бази-
рующейся на унификации термов, всегда бывает либо успехом, либо неус-
пехом. Для сопоставления объекта поиска с элементами просматриваемого
списка необходим предикат, объектами которого и являются эти объект по-
иска и список:
find_it(3 ,[1,2,3,4,5]).
Первый из объектов утверждения, 3, есть объект поиска. Второй - это
список [1,2,3,4,5].
Для выделения
элемента из списка и сравнения его с объектом поиска
можно применить метод разделения списка на голову и хвост. Стратегия по-
иска при этом будет состоять в рекурсивном выделении головы списка и
сравнении ее с элементом поиска.
Так же как в программе "Голова-хвост", при рекурсии хвостом каж-
дый раз становится
новый список, голова которого присваивается перемен-
ной, сравниваемой с объектом поиска. Правило поиска может сравнить
объект поиска и голову текущего списка. Саму операцию сравнения можно
записать в виде
find_it(Head,[Head|_]).
Этот вариант правила предполагает наличие соответствия между объ-
ектом поиска и головой списка. Отметим, что хвост списка при этом при-
сваивается
анонимной переменной. В данном случае, поскольку осуществ-
ляется попытка найти соответствие между объектом поиска и головой спи-
ска, то нет необходимости заботиться о том, что происходит с хвостом. Если
объект поиска и голова списка действительно соответствуют друг другу, то
результатом сравнения явится успех. Если нет, то неуспех. Другими словами,
утверждение
удовлетворяется в случае совпадения объекта поиска и головы
списка. Если же эти два элемента данных различны, то попытка сопостав-
ления считается неуспешной, происходит откат и поиск другого правила
или факта, с которыми можно снова попытаться найти соответствие. Для
случая несовпадения объекта поиска и головы списка, следовательно, необ-
ходимо предусмотреть правило, которое
выделило бы из списка следующий
по порядку элемент и сделало бы его доступным для сравнения. Поскольку
следующий за головой текущего списка элемент является головой текущего
хвоста, мы можем представить этот текущий хвост как новый список, голо-
ву которого можно сравнить с объектом поиска:
find_it(Head, [Head|_].
find_it(Head, [_,Tail]) :-
find_it(Head, Tail).
5.5.1 Поиск элемента в списке Поиск элемента в списке является очень распространенной операцией. Поиск представляет собой просмотр списка на предмет выявления соответст- вия между элементом данных (объектом поиска) и элементом просматри- ваемого списка. Если такое соответствие найдено, то поиск заканчивается успехом. В противном случае поиск заканчивается неуспехом. Результат по- иска, так же как и результат любой другой операции Турбо-Пролога, бази- рующейся на унификации термов, всегда бывает либо успехом, либо неус- пехом. Для сопоставления объекта поиска с элементами просматриваемого списка необходим предикат, объектами которого и являются эти объект по- иска и список: find_it(3 ,[1,2,3,4,5]). Первый из объектов утверждения, 3, есть объект поиска. Второй - это список [1,2,3,4,5]. Для выделения элемента из списка и сравнения его с объектом поиска можно применить метод разделения списка на голову и хвост. Стратегия по- иска при этом будет состоять в рекурсивном выделении головы списка и сравнении ее с элементом поиска. Так же как в программе "Голова-хвост", при рекурсии хвостом каж- дый раз становится новый список, голова которого присваивается перемен- ной, сравниваемой с объектом поиска. Правило поиска может сравнить объект поиска и голову текущего списка. Саму операцию сравнения можно записать в виде find_it(Head,[Head|_]). Этот вариант правила предполагает наличие соответствия между объ- ектом поиска и головой списка. Отметим, что хвост списка при этом при- сваивается анонимной переменной. В данном случае, поскольку осуществ- ляется попытка найти соответствие между объектом поиска и головой спи- ска, то нет необходимости заботиться о том, что происходит с хвостом. Если объект поиска и голова списка действительно соответствуют друг другу, то результатом сравнения явится успех. Если нет, то неуспех. Другими словами, утверждение удовлетворяется в случае совпадения объекта поиска и головы списка. Если же эти два элемента данных различны, то попытка сопостав- ления считается неуспешной, происходит откат и поиск другого правила или факта, с которыми можно снова попытаться найти соответствие. Для случая несовпадения объекта поиска и головы списка, следовательно, необ- ходимо предусмотреть правило, которое выделило бы из списка следующий по порядку элемент и сделало бы его доступным для сравнения. Поскольку следующий за головой текущего списка элемент является головой текущего хвоста, мы можем представить этот текущий хвост как новый список, голо- ву которого можно сравнить с объектом поиска: find_it(Head, [Head|_]. find_it(Head, [_,Tail]) :- find_it(Head, Tail). 105
Страницы
- « первая
- ‹ предыдущая
- …
- 103
- 104
- 105
- 106
- 107
- …
- следующая ›
- последняя »