2015-01-11 2 views
0

я в абсолютной новичок в Прологе, и я борюсь с этой задачей:ПРОЛОГ - узлы любого графа компонента печати

«Там дается разрывной график на входе Написать программу на Прологе, которая в списках вывода отпечатков. из каждых узлов каждого компонента графа .:

прерывистого график, на входе представлен это края, например, так:

e(1,2). 
e(2,4). 
e(2,5). 
e(3,6). 
e(3,7). 
e(7,8). 

это означает, что этот конкретный график, два компонента, и на выходе должна быть что-то

[1,2,4,5], 
[3,6,7,8]. 

я нашел в сети для решения подобной задачи - печать всех узлов графа (http://www.tek-tips.com/viewthread.cfm?qid=1602084), но я даже не могу понять, как это изменить, чтобы применить его на своей задаче напечатать каждый компонент разрывных график отдельно.

Спасибо за любую идею.

+2

Try мышление алгоритма, выражающий его способы, которые подходят для программирования логики, попробуйте написать несколько статей, а затем обратиться за помощью. –

+3

Как абсолютный новичок, начните с более простых программ. – false

ответ

0
connected_components(Cs) :- 
    findall([X,Y], e(X,Y), Pairs), 
    connect(Pairs, Cs). 

connect(Ls, Cs) :- 
    select(A, Ls, Rs), 
    select(B, Rs, Ts), 
    /* check if A & B can be merged in a list */ 
    !, connect([U|Ts], Cs). 
connect(Cs, Cs). 

Моя идея это начать со всеми списками, а затем цикл держать слияние пока есть некоторое разделение элемент. Это расчет по фиксированной точке. В Prolog такой код может быть очень компактным, используя библиотеку (lists).

У меня есть «скрытые» вызовы с двумя заданными операциями (и 1 неравенство), где вы видите псевдокод/​​* чек и т. Д. */ Надеюсь, что вас интересуют обнаружение таких вызовов в вышеупомянутой библиотеке.

Выход:

?- connected_components(Cs). 
Cs = [[6, 3, 7, 8], [1, 4, 2, 5]]. 
Смежные вопросы