Print all graph cycles for the specified node graph, Prolog

I am new to the Prologue world. I am trying to write a predicate to print all graph cycles for the specified node graph, which is an element of this node. My schedule is as follows.

edge(a,e).
edge(e,d).
edge(d,c).
edge(c,b).
edge(b,a).
edge(d,a).
edge(e,c).
edge(f,b).

cycle(X) :-
    cycle(X, []).

cycle(Curr, Visited) :-
    member(Curr, Visited),
    !.
cycle(Curr, Visited) :-
    edge(Curr, Next),
    cycle(Next, [Curr|Visited]).

Unfortunately, now I cannot find a loop for a specific node. For example, I am looking for all loops for node d.

+4
source share
2 answers

I think the problem is that you simply do not have any logic written to return the loop .

Loops that come from node

, , , . , cycle:

cycle(Node,Cycle) :-
    cycle(Node,[],Cycle).

cycle(Curr,Visited,Cycle) :-
    member(Curr,Visited),
    !,
    reverse([Curr|Visited],Cycle).
cycle(Curr,Visited,Cycle) :-
    edge(Curr,Next),
    cycle(Next,[Curr|Visited],Cycle).

reverse/2, ( ). (, , , cycle cycle/3 [Curr|Visited].

, , :

?- cycle(d,Cycle).
Cycle = [d, c, b, a, e, d] ;
Cycle = [d, c, b, a, e, c] ;
Cycle = [d, a, e, d] ;
Cycle = [d, a, e, c, b, a].

, , d , , d. , , .

node

: node, :

cycle(Node,Cycle) :-
    edge(Node,Next),
    cycle(Node,Next,[Node],Cycle).

, edge/2, Node, cycle/4 Node ( , ), Next node, [Node] cycle .

cycle/4 :

  • node, , Node , :

    cycle(Curr,Curr,Visited,Cycle) :-
        !,
        reverse([Curr|Visited],Cycle).
    
  • node, : Curr - Visited, : :/p >

    cycle(_,Curr,Visited,_) :-
        member(Curr,Visited),
        !,
        fail.
    

    fail - , , . , , .

  • , node:

    cycle(Node,Curr,Visited,Cycle) :-
        edge(Curr,Next),
        cycle(Node,Next,[Curr|Visited],Cycle).
    

:

cycle(Node,Cycle) :-
    edge(Node,Next),
    cycle(Node,Next,[Node],Cycle).

cycle(Curr,Curr,Visited,Cycle) :-
    !,
    reverse([Curr|Visited],Cycle).
cycle(_,Curr,Visited,_) :-
    member(Curr,Visited),
    !,
    fail.
cycle(Node,Curr,Visited,Cycle) :-
    edge(Curr,Next),
    cycle(Node,Next,[Curr|Visited],Cycle).

:

?- cycle(d,Cycle).
Cycle = [d, c, b, a, e, d] ;
Cycle = [d, a, e, d] ;

, d d. , :

cycle(Node,Cycle) :-
    edge(Node,Next),
    cycle(Node,Next,[Node],Cycle).

cycle(Curr,Curr,Visited,Cycle) :-
    !,
    reverse([Curr|Visited],Cycle).
cycle(Node,Curr,Visited,Cycle) :-
    \+ member(Curr,Visited),
    edge(Curr,Next),
    cycle(Node,Next,[Curr|Visited],Cycle).

\+ .

+1

, , ... !

, //, :

< > in_cycle (R_2, AZ, ): -% cf. " "   = AZ,   = AZ,   (R_2, Path, First, ButLast),% "", ...  call (R_2, ButLast, Last). %...

# 1 SICStus Prolog 4.3.2:

| ?- in_cycle(edge, d, Path).
Path = [d,c,b,a,e] ? ;
Path = [d,a,e] ? ;
no

№2 edge/2:

< > |? - in_cycle (symm (edge), d, Path). Path = [d, c]?; Path = [d, c, b, a]?; = [d, c, b, a, e]?; Path = [d, c, e]?; Path = [d, c, e, a]?; Path = [d, a]?; = [d, a, e]?; Path = [d, a, e, c]?; Path = [d, a, b, c]?; Path = [d, a, b, c, e]?; Path = [d, e]?; = [d, e, c]?; = [d, e, c, b, a]?; Path = [d, e, a]?; = [d, e, a, b, c]?;

# 1 # 2 — monotonic Prolog 1, 2, 3 :)

+4

Source: https://habr.com/ru/post/1624319/


All Articles