Awkprolog (PrimitiveGuide)
Awkprolog (PrimitiveGuide)
PROLOG
Very high level langauge for beginner
Willow Fung
FREE FOR ALL 2017.
Basic
Command line> awk -f awkprolog.awk father.pro
Fibonacci
File: fib.pro Output
fib(0, 0). 13
fib(1, 1). yes
fib(X, Y) :-
X > 1,
X2 is X - 2,
fib(X2, Y2),
X1 is X - 1,
fib(X1, Y1),
Y is Y1 + Y2.
notequal(X, X) :- !, fail.
notequal(X, Y).
?- compress([a,a,a,a,b,c,c,a,a,d,d,e,e,e,e], X),
writeln(X).
transfer(X,[],[],[X]).
transfer(X,[Y|Ys],[Y|Ys],[X]) :- notequal(X, Y).
transfer(X,[X|Xs],Ys,[X|Zs]) :-
transfer(X,Xs,Ys,Zs).
notequal(X, X) :- !, fail.
notequal(X, Y).
?- pack([a,a,a,a,b,c,c,a,a,d,e,e,e,e],X),
writeln(X).
Problem Solving
Run-length encoding
File: encoding.pro Output
notequal(X, X) :- !, fail. [[2, a], [1, b], [3, c], [2, a], [1, d], [4, e]]
notequal(X, Y). yes
length([], 0).
length([_|L], N) :- length(L, N1), N is N1 + 1.
pack([],[]).
pack([X|Xs],[Z|Zs]) :- transfer(X,Xs,Ys,Z),
pack(Ys,Zs).
transfer(X,[],[],[X]).
transfer(X,[Y|Ys],[Y|Ys],[X]) :- notequal(X, Y).
transfer(X,[X|Xs],Ys,[X|Zs]) :-
transfer(X,Xs,Ys,Zs).
transform([],[]).
transform([[X|Xs]|Ys],[[N,X]|Zs]) :-
length([X|Xs],N), transform(Ys,Zs).
?- encode([a,a,b,c,c,c,a,a,d,e,e,e,e],X),
writeln(X).
Hanoi Tower
File: hanoi.pro Output
hanoi(N) :- move(N, left, middle, right). left -> right
move(1, A, U, C) :- inform(A, C), !. left -> middle
move(N, A, B, C) :- right -> middle
N1 is N - 1, left -> right
move(N1, A, C, B),
middle -> left
inform(A, C),
move(N1, B, A, C). middle -> right
left -> right
inform(P1, P2) :- write(P1), write(' -> '), left -> middle
writeln(P2). right -> middle
right -> left
?- hanoi(5). middle -> left
right -> middle
left -> right
left -> middle
right -> middle
left -> right
middle -> left
middle -> right
left -> right
middle -> left
right -> middle
right -> left
middle -> left
middle -> right
left -> right
left -> middle
right -> middle
left -> right
middle -> left
middle -> right
left -> right
yes
Find Path
File: path.pro Output
a(a, c). The path from s to z : [s, w, u, y, z]
z
a(a, b). yes
a(b, f). y u
a(s, w).
a
a(y, a).
z
a(y, z). c
a(w, u). b w y u
a(u, y).
a
a(c, w).
f s c
not(G) :- G, !, fail. b w
not(G).
path(X, X, T, [X]). f s
path(X, Z, T, [X|T2]) :-
a(X, Y),
not(member(Y, T)),
path(Y, Z, [Y|T], T2).
member(X, [X|_]).
member(X, [_|T]) :- member(X, T).
1
noattack(_, []).
noattack(X / Y, [X1 / Y1 | Other]) :- 2
Y =\= Y1,
3
Y1 - Y =\= X1 - X,
Y1 - Y =\= X - X1, 4
Position Y
noattack(X/Y, Other).
5
not(G) :- G, !, fail.
not(G).
eq(X, X).
2
2
%********************************* 1 3
1 3
% Define states in a Country
%********************************* 4
4
5 5
country(S1, S2, S3, S4, S5) :-
n(S1, S2), n(S1, S3), n(S1, S4), n(S1, S5), 2
n(S2, S1), n(S2, S3), n(S2, S4),
1 3
n(S3, S1), n(S3, S2), n(S3, S4),
n(S4, S1), n(S4, S2), n(S4, S3), n(S4, S5),
4
n(S5, S1), n(S5, S4). 5
2 2
1 3 1 3
1 3
4
5
Basic Sorting Algorithm
File: sortbubble.pro Output
sort(L, S) :- swap(L, L1), !, sort(L1, S). [1, 6, 7, 8, 20, 21, 23, 30, 32, 45]
sort(S, S). yes
swap([X, Y | R], [Y, X | R]) :- X > Y.
swap([Z | R], [Z | R1]) :- swap(R, R1).
conc([],L,L).
conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3).
%*******************************************************
block(Va, Vb, Vc) :-
eat(begin, Vb, Vd), actions(Va, Vd, Ve), eat(end, Ve, Vc).
actions([Va|Vb], Vc, Vd) :-
action(Va, Vc, Ve), more_actions(Vb, Ve, Vd).
more_actions(Va, Vb, Vc) :- eat(sep, Vb, Vd), actions(Va, Vd, Vc).
more_actions([], Va, Va) :- true.
action(if(Va, Vb, Vc), Vd, Ve) :-
eat(if, Vd, Vf), cond(Va, Vf, Vg), eat(then, Vg, Vh), block(Vb, Vh, Vi),
eat(else, Vi, Vj), block(Vc, Vj, Ve).
action(while(Va, Vb), Vc, Vd) :-
eat(while, Vc, Ve), cond(Va, Ve, Vf), eat(do, Vf, Vg), block(Vb, Vg, Vd).
action(assign(Va, Vb), Vc, Vd) :-
eat(id(Va), Vc, Ve), eat(eq, Ve, Vf), expr(Vb, Vf, Vd).
expr(Va, Vb, Vc) :-
term(Vd, Vb, Ve), exprtail(Vd, Va, Ve, Vc).
exprtail(Va, add(Va, Vb), Vc, Vd) :-
eat(add, Vc, Ve), term(Vf, Ve, Vg), exprtail(Vf, Vb, Vg, Vd).
exprtail(Va, sub(Va, Vb), Vc, Vd) :-
eat(sub, Vc, Ve), term(Vf, Ve, Vg), exprtail(Vf, Vb, Vg, Vd).
exprtail(Va, mul(Va, Vb), Vc, Vd) :-
eat(mul, Vc, Ve), term(Vf, Ve, Vg), exprtail(Vf, Vb, Vg, Vd).
exprtail(Va, div(Va, Vb), Vc, Vd) :-
eat(div, Vc, Ve), term(Vf, Ve, Vg), exprtail(Vf, Vb, Vg, Vd).
exprtail(Va, Va, Vb, Vb) :- true.
term(id(Va), Vb, Vc) :- eat(id(Va), Vb, Vc).
term(const(Va), Vb, Vc) :- eat(const(Va), Vb, Vc).
cond(Va, Vb, Vc) :- eat(id(Vd), Vb, Ve), ctail(Vd, Va, Ve, Vc).
ctail(Va, eq(Va, Vb), Vc, Vd) :- eat(eq, Vc, Ve), expr(Vb, Ve, Vd).
ctail(Va, ne(Va, Vb), Vc, Vd) :- eat(ne, Vc, Ve), expr(Vb, Ve, Vd).
ctail(Va, idtest(Va), Vb, Vb) :- true.
File: proc_1.pas
?- L = [begin, id("X"), eq, const(5), add, const(3), sep, id("Y"), eq, id("X"), sub, const(2),
end], block(T, L, R), writeln(T).
?- L = [if, id("X"), eq, const(3), add, id("Y"), then, begin, id("X"), eq, const(3), end,
else, begin, id("X"), eq, const(4), end], actions(T, L, R), writeln(T).
assign assign
X add Y sub
5 3 X 2
File: compiler.pro
cg(I, [pushc(I)]) :- number(I).
cg(A, [push(A)]) :- atomic(A).
cg([], []).
cg([A|B], [CA, CB]) :- cg(A, CA), cg(B, CB).
append([], L, L).
append([H|T], L, [H|L2]) :- append(T, L, L2).
flatten([], []).
flatten([H|T], L3) :- flatten(H, L1), flatten(T, L2), append(L1, L2, L3).
flatten(X, [X]).
find_symbol([], D, D) :- !.
find_symbol([push(X) | T], D, D3) :- add_sym(X, D, D2), find_symbol(T, D2, D3).
find_symbol([pop(X) | T], D, D3) :- add_sym(X, D, D2), find_symbol(T, D2, D3).
find_symbol([H | T], D, DD) :- find_symbol(T, D, DD).
member(X, [X | L]) :- !.
member(X, [Y | L]) :- member(X, L).
allocate([], N, []).
allocate([H | T], N, [sym(H, N) | T2]) :- N2 is N + 1, allocate(T, N2, T2).
out_code([], N) :- !.
out_code([label(A)|T], N) :- !, out_code(T, N).
out_code([H|T], N) :- !, write(N), write(':'), writeln(H), N2 is N + 1, out_code(T, N2).
ass([], N, N, D, D) :- !.
ass([label(A)|T], A, B, D, D2) :- !, ass(T, A, B, D, D2).
ass([H|T], N, NN, D, D2) :- !, N2 is N + 1, ass(T, N2, NN, D, D2).
assign assign
X add Y sub
5 3 X 2