TURBO PROLOG. Терёхин В.В. - 105 стр.

UptoLike

Составители: 

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