Path1(А, Р1, G, Р)

Постановка 5.

Ациклічний шлях Р між вершинами А і Z у заданому явно графі G позначимо відношенням path(А, Z, G, Р).

Для графа Gна рис. 1 (а) вірними є твердження:

path( a, d, G, [a, b, d] )

path( а, d, G, [a, b, c, d] ).

 

Оскільки шлях має бути ациклічним, всяка вершина у шляху може зустрітись лише раз. Один з методів пошуку шляху відповідно до предикату path(А, Z, G, Р):

§ якщо А=Z, то покласти шлях Р= [А],

§ інакше знайти ациклічний шлях Р1 з довільної вершини Y в вершину Z, а потім шлях з А в Y без використання вершин з шляху Р1.

Для цього визначено ще один предикат:

чиї аргументи мають наступний смисл:

§ А - деяка вершина,

§ P1 - шлях в G,

§ G - граф,

§ Р - ациклічний шлях в G, що йде з А в початкову вершину шляху Р1, а потім - уздовж шляху Р1.

Pис. 3. Відношення path фіксує шлях Р між А і Z, що у своїй заключній частині співпадає зі шляхомР1між вершинамиY і Z відношенняpath1.

Між path і path1 має місце наступне співвідношення:

path(А, Z, G, Р) :- path1( А, [Z], G, Р).

На рис.3 показана ідея рекурсивного визначення відношення path1. Існує "граничний" випадок, коли початкова вершина шляху P1 (Y на рис. 3) збігається з початковою вершиною А шляху Р. Якщо ж початкові вершини цих двох шляхів не збігаються, то має існувати така вершина X, що

(1) Y - вершина, суміжна з X,

(2) Х не втримується в Р1 та

(3) для Р виконується відношення

path1( А, [Х | Р1], G, Р).

Таким чином, пошук у графі G ациклічного шляху Р з вершини А в Z визначається наступною програмою:

path( A, Z, G, Р) :- path1( А, [Z], G, Р).

path1( А, [А | Р1], _, [А | Р1] ).

path1( А, [Y | Р1], G, Р) :- incident( X, Y, G),

not(member(X, Р1)),% Умова відсутності циклу

path1( А, [ X, Y | Р1], G, Р).

 

Тут відношення інцидентності (суміжності) вершин