Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 2.40 KB | None | 0 0
  1. % This buffer is for notes you don't want to save.
  2. % If you want to create a file, visit that file with C-x C-f,
  3. % then enter the text in that file's own buffer.
  4.  
  5. :- dynamic(node/1).
  6. :- dynamic(edge/3).
  7.  
  8. printMenu :-
  9.     writef('\nMENU\n'),
  10.     writef('1. Add node\n'),
  11.     writef('2. Delete node\n'),
  12.     writef('3. Add edge\n'),
  13.     writef('4. Delete edge\n'),
  14.     writef('5. Show graph\n'),
  15.     writef('6. Show cost\n'),
  16.     writef('0. Exit\n'),
  17.     writef('Select your option\n').
  18.  
  19. addNode(X) :- node(X),
  20.     writef('Node %d already exists\n', [X]).
  21. addNode(X) :- assert(node(X)).
  22.  
  23. deleteNode(X) :- not(node(X)),
  24.     writef('Node %d does not exist\n', [X]).
  25. deleteNode(X) :- node(X),
  26.     retractall(edge(X,_,_)),
  27.     retractall(edge(_,X,_)),
  28.     retract(node(X)).
  29.  
  30. addEdge(X,Y,_) :- not(node(X)) ; not(node(Y)),
  31.     writef('Node %d or %d does not exist\n',[X, Y]).
  32. addEdge(_,_,Z) :- Z < 1,
  33.     writef('Edge distance cannot be 0 or negative\n').
  34. addEdge(X,Y,_) :- edge(X, Y, _),
  35.     writef('Edge already exists from %d to %d\n', [X, Y]).
  36. addEdge(X,Y,Z) :- assert(edge(X,Y,Z)).
  37.  
  38. deleteEdge(X,Y) :- not(edge(X,Y,_)),
  39.     writef('Edge from %d to %d does not exist\n', [X, Y]).
  40. deleteEdge(X,Y) :-
  41.     retract(edge(X,Y,_)).
  42.  
  43. showGraph :-
  44.     findall(N,node(N),R1),
  45.     writef('Nodes %s\n', [R1]),
  46.     findall([X,Y,C],edge(X,Y,C), R2),
  47.     write('Edges '), write(R2), writef('\n').
  48.  
  49. path(X,Y,-1000) :- not(edge(X,Y,_)).
  50. path(X,Y,C) :- edge(X,Y,C).
  51. path(X,Y,C) :- edge(X,A,C1),
  52.     path(A,Y,C2),
  53.     C is C1 + C2.
  54.  
  55. showCost(X,Y) :- not(node(X)) ; not(node(Y)),
  56.     writef('Node %d or %d does not exist\n', [X,Y]).
  57. showCost(X,Y) :- path(X,Y,C),
  58.     C < 1,
  59.     writef('Path from %d to %d does not exist\n', [X,Y]).
  60. showCost(X,Y) :- path(X,Y,C),
  61.     writef('Cost from %d to %d is %d', [X,Y,C]).
  62.  
  63.  
  64. selected(0).
  65. selected(1) :-
  66.     writef('Adding node\n'),
  67.     read(X),
  68.     addNode(X),
  69.     graphExe.
  70. selected(2) :-
  71.     writef('Deleting node\n'),
  72.     read(X),
  73.     deleteNode(X),
  74.     graphExe.
  75. selected(3) :-
  76.     writef('Adding edge\n Insert X, Y and C\n'),
  77.     read(X),
  78.     read(Y),
  79.     read(Z),
  80.     addEdge(X,Y,Z),
  81.     graphExe.
  82. selected(4) :-
  83.     writef('Deleting edge\n Insert X and Y\n'),
  84.     read(X),
  85.     read(Y),
  86.     deleteEdge(X,Y),
  87.     graphExe.
  88. selected(5) :-
  89.     writef('Show graph\n'),
  90.     showGraph,
  91.     graphExe.
  92. selected(6) :-
  93.     writef('Show cost\n'),
  94.     read(X),
  95.     read(Y),
  96.     showCost(X,Y).
  97. selected(X) :-
  98.     writef('Option %d not found!\n',X),
  99.     graphExe.
  100.  
  101. graphExe :-
  102.     printMenu,
  103.     read(X),
  104.     selected(X).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement