ВУЗ:
Составители:
Рубрика:
59
edge(a,b).
edge(b,c).
edge(c,a).
edge(b,d).
edge(d,e).
member(A,[A|_]):-!.
member(A,[_|T]):-member(A,T).
reverse([],T2,T2).
reverse([H|T],T1,T2):-reverse(T,[H|T1],T2).
path(A,B,P,[B|P]):-edge(A,B).
path(A,B,P,P2):-edge(A,N),not(member(N,P)),
P1=[N|P], path (N,B,P1,P2).
path(A,B):-path(A,B,[A],P),reverse(P,[],Res),write(Res).
goal
path(a,e).
2.20 Метод “образовать и проверить”
Метод “образовать и проверить” – общий прием, используемый при
проектировании алгоритмов и программ. Суть его состоит в том, что один
процесс или программа генерирует множество предполагаемых решений
задачи, а другой процесс или программа проверяет эти предполагаемые
решения, пытаясь найти те из
них, которые действительно являются
решением задачи.
Используя вычислительную модель Пролога, легко создавать
логические программы, реализующие метод “образовать и проверить”.
Обычно такие программы содержат конъюнкцию двух целей, одна из
которых действует как генератор предполагаемых решений, а вторая
проверяет, являются ли эти решения приемлемыми. В Прологе метод
“образовать и проверить” рассматривается как
метод недетерминированного
программирования. В такой недетерминированной программе генератор
вносит предположение о некотором элементе из области возможных
решений, а затем просто проверяется, корректно ли данное предположение
генератора.
Для написания программ недетерминированного выбора конкретного
элемента из некоторого списка в качестве генератора обычно используют
предикат member из примера 27, порождающий множество решений. При
задании цели
member (X, [1,2,3,4]) будут даны в требуемой
последовательности решения X=1, X=2, X=3, X=4.
Пример 72: проверить существование в двух списках одного и того же
элемента.
domains
list=integer*
predicates
member (integer, list)
Страницы
- « первая
- ‹ предыдущая
- …
- 57
- 58
- 59
- 60
- 61
- …
- следующая ›
- последняя »