Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 104
- 105
- 106
- 107
- 108
- …
- следующая ›
- последняя »