-
Notifications
You must be signed in to change notification settings - Fork 1
/
hc.pl
83 lines (76 loc) · 1.76 KB
/
hc.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
use_module(library(readln)).
database
vuelo(string,string, integer)
visitado(string)
predicates
ruta(string, string, integer)
es_vuelo(string, string, integer)
displayruta
purgar
encontar_ruta
add_a_ruta(string)
encontrar_mas_grande(string,string)
goal
assert(vuelo(nueva_york,chicago,1000)),
assert(vuelo(chicago,denver,1000)),
assert(vuelo(nueva_york,toronto,800)),
assert(vuelo(nueva_york,denver,1900)),
assert(vuelo(toronto,calgary,1500)),
assert(vuelo(toronto,los_angeles,1800)),
assert(vuelo(toronto,chicago,500)),
assert(vuelo(denver,urbana,1000)),
assert(vuelo(denver,houston,1500)),
assert(vuelo(houston,los_angeles,1500)),
assert(vuelo(denver,los_angeles,1000)),
encontrar_ruta,nl,
write("mas? "),not(purgar),
readln(Q),
Q=n.
cluases
encontrar_ruta:-
write("desde: "),
readln(A),
write("a: "),readln(B),
ruta(A,B,D),
write("la distacia es: ",D),nl,
not(display).
ruta(A,B,C):-
es_vuelo(A,B,C).
ruta(_,_,C):-
write("no hay ruta o no"),
nl,
write("esta dentro de la distancia especificada"),nl,
D=0,purgar.
es_vuelo(T,T2,D):-
vuelo(T,T2,D),
add_a_ruta(T).
es_vuelo(T,T2,D):-
encontrar_mas_grande(T,X),
add_a_ruta(T),
vuelo(T,X,D2),
es_vuelo(X,T2,D3),
D=D2+D3.
es_vuelo(T,T2,D):-
vuelo(T,X,D2),
X<>T2,
add_a_ruta(T),
es_vuelo(X,T2,D3),
D=D2+D3.
encontrar_mas_grande(A,B):-
vuelo(A,X,D2),
vuelo(A,Y,D2),
X<>Y,
D2<>D,
B=Y.
add_a_ruta(T):-
not(visitado(T)),
assert(visitado(T)),!.
add_a_ruta(_).
purgar:-
retract((visitado(_))),
fail,!.
displayruta:-
write("la ruta es: "),nl,
visitado(A),
write(A),nl,
fail,!.