RosettaCodeData/Task/Church-numerals/Prolog/church-numerals.pro
2023-07-01 13:44:08 -04:00

41 lines
907 B
Prolog

church_zero(z).
church_successor(Z, c(Z)).
church_add(z, Z, Z).
church_add(c(X), Y, c(Z)) :-
church_add(X, Y, Z).
church_multiply(z, _, z).
church_multiply(c(X), Y, R) :-
church_add(Y, S, R),
church_multiply(X, Y, S).
% N ^ M
church_power(z, z, z).
church_power(N, c(z), N).
church_power(N, c(c(Z)), R) :-
church_multiply(N, R1, R),
church_power(N, c(Z), R1).
int_church(0, z).
int_church(I, c(Z)) :-
int_church(Is, Z),
succ(Is, I).
run :-
int_church(3, Three),
church_successor(Three, Four),
church_add(Three, Four, Sum),
church_multiply(Three, Four, Product),
church_power(Four, Three, Power43),
church_power(Three, Four, Power34),
int_church(ISum, Sum),
int_church(IProduct, Product),
int_church(IPower43, Power43),
int_church(IPower34, Power34),
!,
maplist(format('~w '), [ISum, IProduct, IPower43, IPower34]),
nl.