-
Notifications
You must be signed in to change notification settings - Fork 0
/
5.4_ejemplo_de_examen.pl
65 lines (58 loc) · 1.73 KB
/
5.4_ejemplo_de_examen.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
% ------------------------------
% SUPUESTO DE EJERCICIO
% ------------------------------
% Leer una cadena a^x, b^y, c^z tal que y = x + z
% Hecho de esta manera, los estados son independientes de las pilas.
caso(e0, a, [], e0, [a]).
caso(e0, a, H, e0, [a|H]).
caso(e0, b, [a|H], e1, H).
caso(e1, b, [a|H], e1, H).
caso(e1, b, [], e1, [b]).
caso(e1, b, H, e1, [b|H]).
caso(e1, c, [b|H], e2, H).
caso(e2, c, [b|H], e2, H).
mueve(e2, [], [], eF).
mueve(Ei, [Li|L], Pi, Ef):-
caso(Ei, Li, Pi, En, Pn),
write(Pn), nl,
mueve(En, L, Pn, Ef).
comprueba(L, Res):-
mueve(e0, L, [], Ef),
Ef = eF,
Res is 1,
!.
solve(A):-
predicate_property(A,built_in),
!,
call(A).
solve(true):-!.
solve((A,B)):-
!,
solve(A),
solve(B).
solve(A):-
clause(A,B),
solve(B).
% --------------------------
% EXPLICACION
% --------------------------
%
% Este ejercicio es algo más complicado al ser mayor la subcadena
% intermedia que las otras dos. Utilizando una sola pila, la mejor opción
% es volver a rellenar la misma una vez el número de b's haya rebasado el
% número de a's. La explicación de los estados es:
%
% Estado 1.
% Siempre que reciba una 'a', añadirá este símbolo a la pila.
% Cambiará de estado al encontrar una 'b'.
% Estado 2.
% Siempre que encuentre una 'b', quitará una 'a' de la pila. Cuando
% la pila se quede vacía (y si sigue encontrando el símbolo 'b'),
% añadirá el símbolo a la pila.
% Estado 3.
% Siempre que encuentre una 'c', quitará una 'b' de la pila hasta
% vaciarlo.
%
% El autómata finaliza correctamente si la lista y la pila están vacías.
% De esta manera, nos aseguramos que el funcionamiento es correcto. Sin
% embargo, cabe replantearse si este es el mejor comportamiento.