algebra - Define a connectivity graph in Prolog -


i'm continuing researches in lattices , semilattices , having question.

basically, have relationlist of [a,b] pairs, means (a,b) edge. should know, graph formed relationlist 1-connectivity or not. way, have ordered graph, order of (a,b) important.

clear_link(x, y, relationlist) :-     (member([x,y], relationlist)     ;     member([y,x], relationlist)),     x =\= y.  linked(x, y, relationlist) :-     clear_link(x, y, relationlist),     !. linked(x, y, relationlist) :-     clear_link(x, z, relationlist),     linked(z, y, relationlist).  simple_connect(relationlist, e) :-     forall((member(x, e),     member(y, e), x < y),     linked(x, y, relationlist)). 

but, 6-element graph have stackoverflow.

?- simple_connect([[2,1],[2,3],[4,3],[4,5],[6,5]],[1,2,3,4,5,6]). error: out of local stack 

am defining wrong?

i've correct some. it's fine

clear_link(x, y, relationlist) :-     member([x,y], relationlist),     x =\= y.  linked(x, y, relationlist) :-     clear_link(x, y, relationlist),     !. linked(x, y, relationlist) :-     clear_link(x, z, relationlist),     linked(z, y, relationlist),     !.  simple_connect(relationlist, e) :-     forall((member(x, e),     member(y, e), x < y),     linked(x, y, relationlist)).  connective_graph(relationlist, e) :-     findall(relation, (         member(x, relationlist),         sort(x, relation)     ),sortrelationlist),     simple_connect(sortrelationlist, e). 

and

?- connective_graph([[2,1],[2,3],[4,3],[4,5],[6,5]],[1,2,3,4,5,6]). true.  ?- connective_graph([[2,1],[4,3],[4,5],[6,5]],[1,2,3,4,5,6]). false. 

right answer (copy post)

connected(x, y, relationlist) :-     (member([x,y], relationlist);     member([y,x], relationlist)).  path(x, y, relationlist, path) :-     travel(x, y, relationlist, [x], reversepath),     reverse(reversepath, path),!.  travel(x, y, relationlist, point, [y | point]) :-     connected(x, y, relationlist). travel(x, y, relationlist, visited, path) :-     connected(x, z, relationlist),     z =\= y,     \+member(z, visited),     travel(z, y, relationlist, [z|visited], path).  connective_graph(relationlist, e) :-     forall((member(x, e),         member(y, e),         x < y)     ,path(x,y,relationlist,_)). 

Comments

Popular posts from this blog

apache - Add omitted ? to URLs -

redirect - bbPress Forum - rewrite to wwww.mysite prohibits login -

php - How can I stop spam on my custom forum/blog? -