Skip to content

Instantly share code, notes, and snippets.

@jirrick
Last active December 15, 2015 08:38
Show Gist options
  • Save jirrick/5231953 to your computer and use it in GitHub Desktop.
Save jirrick/5231953 to your computer and use it in GitHub Desktop.
neprocko pyčo
% DU_1 - test prvociselnosti v unarni aritmetice
% Jiri Hudec
% polovina(X,Y) - metoda pro nalezeni poloviny (+1)
polovina(X,Y):-polovina3(X,0,Y).
% polovina3(X,Y,Z) - pomocna metoda pro nalezeni poloviny
polovina3(0,Y,s(Y)).
polovina3(s(0),Y,Z):-polovina3(0,Y,Z).
polovina3(s(s(X)),Y,Z):-polovina3(X,s(Y),Z).
% odecti - metoda pro odcitani cisel
odecti(X,0,X).
odecti(s(X),s(Y),Z):-odecti(X,Y,Z).
% rovno(X,Y) - metoda pro porovnavani cisel
rovno(0, 0).
rovno(s(X), s(Y)):-rovno(X, Y).
% vetsi(X,Y) - metoda pro porovnavani cisel
vetsi(s(_), 0).
vetsi(s(X), s(Y)):-vetsi(X, Y).
% modulo(X,Y,Z) - metoda vypoctu zbytku po deleni (Z) cisla X cislem Y
modulo(X,Y,Z):-modulo4(0,X,Y,Z).
modulo4(1,X,_,X).
modulo4(_,X,Y,Z):-rovno(Y,X), modulo4(1,0,Y,Z).
modulo4(_,X,Y,Z):-vetsi(Y,X), modulo4(1,X,Y,Z).
modulo4(W,X,Y,Z):-vetsi(X,Y), odecti(X,Y,X1), modulo4(W,X1,Y,Z).
% test (X,Y,Z)
% X - testovane cislo
% Y - testovaci cislo
% Z - hranice testovani
test(_,Y,Z):-rovno(Y,Z).
test(X,Y,Z):-vetsi(Z,Y), modulo(X,Y,A), ( rovno(A,0) -> (!, fail) ; (!, test(X,s(Y),Z))).
% vytvor(X,Y) - pomocna metoda pro tvoreni cisel v nasi unarni artimetice.
vytvor(0,0).
vytvor(X,s(Y)):-X>0, X1 is X - 1, vytvor(X1,Y).
%------------------------
% je_prvocislo (testovani od dvojky)
je_prvocislo(X):-polovina(X,X1), test(X,s(s(0)),X1).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment