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

UptoLike

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

106
Если правило find_it(Head,[Head|_]) неуспешно, то происходит откат,
и делается попытка со вторым вариантом find_it.
На этом втором вхождении предиката find_it Турбо-Пролог унифици-
рует имеющиеся термы с заголовком правила find_it([Head,[_,Rest]).
Заметим, что при этом первый элемент списка ставится в соответствие
анонимной переменной. Так делается вследствие того, что значение первого
элемента
не представляет для нас интереса; данное правило не было бы за-
действовано, если бы этот элемент совпадал с объектом поиска при попыт-
ке с find_it(Head,[Head,_]). Теперь мы хотим присвоить переменной хвост
списка (не голову !), чтобы Турбо-Пролог попытался установить соответст-
вие между объектом поиска и головой списка хвоста. Попытка удовлетворить
рекурсивное правило find_it(Head,Rest) заставляет Турбо-Пролог предста-
вить хвост текущего как новый самостоятельный список. Опять присвоенный
переменной Rest список разделяется на голову и хвост при посредстве ут-
верждения find_it(Head, [Head|_]). Процесс повторяется до тех пор, пока это
утверждение дает либо успех в случае установления соответствия на оче-
редной рекурсии, либо неуспех в
случае исчерпания списка.
Программа "Элементы" (листинг 5.3) демонстрирует реализацию опе-
рации поиска элемента в списке. Поскольку предикат find_it определен как
для списков целых чисел, так и для списков символических имен, то в дан-
ной программе он и работает со списками обоих типов.
____________________________________________________________
Листинг 5.3
/* Программа: Элементы Файл: PROG0503.PRO */
/* Назначение: Поиск нужного элемента
в списке. */
domains
number_list = number *
number = integer
member_list = member *
member = symbol
predicates
find_it(number, number_list)
find_it(member, member_list)
clauses
find_it(Head, [Head|_]).
find_it(Head, [_|Tail]) :-
find_it(Head, Tail).
/***** конец программы *****/
____________________________________________________________
Если задать цель
find_it(3,[1,2,3,4,5])
то первый вариант правила пытается установить соответствие между голо-
вой списка, 1, и объектом поиска, 3. Вследствие неравенства 1 и 3 результа-
       Если правило find_it(Head,[Head|_]) неуспешно, то происходит откат,
и делается попытка со вторым вариантом find_it.
       На этом втором вхождении предиката find_it Турбо-Пролог унифици-
рует имеющиеся термы с заголовком правила find_it([Head,[_,Rest]).
Заметим, что при этом первый элемент списка ставится в соответствие
анонимной переменной. Так делается вследствие того, что значение первого
элемента не представляет для нас интереса; данное правило не было бы за-
действовано, если бы этот элемент совпадал с объектом поиска при попыт-
ке с find_it(Head,[Head,_]). Теперь мы хотим присвоить переменной хвост
списка (не голову !), чтобы Турбо-Пролог попытался установить соответст-
вие между объектом поиска и головой списка хвоста. Попытка удовлетворить
рекурсивное правило find_it(Head,Rest) заставляет Турбо-Пролог предста-
вить хвост текущего как новый самостоятельный список. Опять присвоенный
переменной Rest список разделяется на голову и хвост при посредстве ут-
верждения find_it(Head, [Head|_]). Процесс повторяется до тех пор, пока это
утверждение дает либо успех в случае установления соответствия на оче-
редной рекурсии, либо неуспех в случае исчерпания списка.
       Программа "Элементы" (листинг 5.3) демонстрирует реализацию опе-
рации поиска элемента в списке. Поскольку предикат find_it определен как
для списков целых чисел, так и для списков символических имен, то в дан-
ной программе он и работает со списками обоих типов.
____________________________________________________________
                   Листинг 5.3
/* Программа: Элементы           Файл: PROG0503.PRO */
/* Назначение: Поиск нужного элемента в списке. */
       domains
             number_list = number *
                        number = integer
             member_list = member *
                        member = symbol

     predicates
           find_it(number, number_list)
           find_it(member, member_list)

      clauses
            find_it(Head, [Head|_]).
            find_it(Head, [_|Tail]) :-
                         find_it(Head, Tail).
      /*****                 конец программы        *****/
____________________________________________________________
      Если задать цель
            find_it(3,[1,2,3,4,5])
то первый вариант правила пытается установить соответствие между голо-
вой списка, 1, и объектом поиска, 3. Вследствие неравенства 1 и 3 результа-


                                                                        106