Ответ в теме: Вывести вершины, не соединенные ребрами

      Комментарии к записи Ответ в теме: Вывести вершины, не соединенные ребрами отключены
#1841

Нужно вывести все пары вершин, между которыми нет пути или просто найти изолированные вершины графа (т.е. вершины нулевой степени)?

Поиск пар вершин:

nonadjacency(A, B):-
    ver(A), ver(B), \+reb(_, A, B).

Пролог — это язык очень близкий к математике. Поэтому такие утверждения записываются очень просто и лаконично. В этом утверждении мы просим его найти вершины A и B такие, что нет дуги из A в B.
Если граф неориентированный, то можно написать так:

nonadjacency(A, B):-
    ver(A), ver(B), \+(reb(_, A, B);reb(_, B, A)).

Тут мы просим машину логического вывода найти такие вершины A и B, что нет ни дуги из A в B, ни дуги из B в A. Хотя я думаю, что лучше описать правило edge следующим образом:
edge(A, B):- reb(_, A, B); reb(_, B, A).

И вызывать его вместо reb — это более гибкое решение.
Правило nonadjacency возвращает вам пару вершин. Получить все можно при помощи следующего запроса:

?- nonadjacency(A, B), write((A, B)), nl, fail.
1,1
1,4
1,5
1,6

Либо с использованием стандартного предиката findall:

?- findall((A, B), nonadjacency(A, B), L), write(L), nl.
[ (1,1), (1,4), (1,5), (1,6), (1,7), (2,2), (2,5), (2,6), (2,7), (3,3), (3,4), (3,6), (3,7), (4,1), (4,3), (4,4), (4,6), (4,7), (5,1), (5,2), (5,5), (5,6), (5,7), (6,1), (6,2), (6,3), (6,4), (6,5), (6,6), (7,1), (7,2), (7,3), (7,4), (7,5), (7,7)]
L = [ (1, 1), (1, 4), (1, 5), (1, 6), (1, 7), (2, 2), (2, 5), (2, 6), (..., ...)|...].

Если же Вам требуется найти вершины, между которыми нет пути (а не ребра, как Вы описали в задании), то вместо reb в правиле edge вызывайте правило поиска пути, описанное в статье. Не важно будет это поиск в глубину или поиск в ширину.