% 1. feladat: pozitívak kilistázása
int(X):- X1 is X+1, write(X), nl, int(X1).
int:- int(0).
% 2. feladat: egészek kilistázása
poz(N):- write(N), nl, neg(N).
neg(N):- M is -N, write(M), nl, N1 is N+1, poz(N1).
eg:- write(0), poz(1).
% 3. feladat: N és M közötti K-val
oszthatók
kilistázása
nmk(N,M,K):- N=<M, E is N mod K, kiir(N,E), N1 is N+1, nmk(N1,M,K).
nmk(_,_,_).
kiir(N,0):- write(N), nl.
kiir(_,M):- M=\=0.
% 4. feladat: gyök
kiszámítása/közelítése
gyok(N,Gyok):- gyok(N,0,N,Gyok).
gyok(_,Al,Fel,Al):- 1 >= Fel-Al.
gyok(N,Al,Fel,Gyok):- Koz is (Al+Fel) >> 1, Koz*Koz>N,
gyok(N,Al,Koz,Gyok).
gyok(N,Al,Fel,Gyok):- Koz is (Al+Fel) >> 1, Koz*Koz=<N,
gyok(N,Koz,Fel,Gyok).
% 5. feladat: listák különbségének
előállítása
kiszed(_,[],[]).
kiszed(A,[A|L1],L):- kiszed(A,L1,L).
kiszed(A,[B|L1],[B|L]):- A\=B, kiszed(A,L1,L).
kulonb(L,[],L).
kulonb(L1,[E|L2],L):- kiszed(E,L1,L3), kulonb(L3,L2,L).
% 6. feladat: input tökéletes szám-e
tokeletes(X):- osztossz(X,X,Ossz), Ossz =:= 2*X.
osztossz(X,Y,UjOssz):- Y>1, Y1 is Y-1, osztossz(X,Y1,Ossz),
noveles(X,Y,Nov), UjOssz is Ossz+Nov.
osztossz(_,1,1).
noveles(X,Y,Y):- 0 =:= X mod Y.
noveles(X,Y,0):- 0 =\= X mod Y.
% 7. feladat: {1,2,...,K}-ból
képzett, legalább N hosszú monoton
növő sorozatok legenerálása.
:- use_module(library(lists)).
:- nl,write('Program hivasa: mon_nov(K,N)'),nl,nl.
between(N,M,N):- N =< M.
between(N,M,I):- N < M, N1 is N+1, between(N1,M,I).
mon_nov(K,N):- mon_nov(1,K,N,L), write(L), nl, fail.
mon_nov(_,_).
mon_nov(_,_,N,[]):- N>=0.
mon_nov(Min,Max,N,[Uj|L]):- N>0,
between(Min,Max,Uj),
UjMin is Uj+1,
N1 is N-1,
mon_nov(UjMin,Max,N1,L).
% 8. feladat: középpontjával és
sugarával megadott kör pontjainak
legenerálása
(inditas: gen(L))
:-use_module(library(lists)).
kor((1,4),3).
kivul((X,Y)):- kor((A,B),R), (X-A)*(X-A)+(Y-B)*(Y-B)>R*R.
gen(L):- kor(P,_), !, gen(P,[],L).
gen(P,L,L):- kivul(P), !.
gen(P,L,L):- member(P,L), !.
gen((X,Y),LIn,LOut):- X1 is X+1,
gen((X1,Y),[(X,Y)|LIn],L1),
X2 is X-1, gen((X2,Y),L1,L2),
Y1 is Y+1, gen((X,Y1),L2,L3),
Y2 is Y-1, gen((X,Y2),L3,LOut).
% 9. feladat: körök metszetében lévő
rácspontok legenerálása (inditas: gen(L))
:-use_module(library(lists)).
kor((1,4),3).
kor((2,3),2).
kor((0,1),2).
kivul((X,Y)):- kor((A,B),R), (X-A)*(X-A)+(Y-B)*(Y-B)>R*R.
jobbszel(X):- kor((A,_),R), !, X is A+R.
teteje(Y):- kor((_,B),R), !, Y is B+R.
bovit(P,L,L):- kivul(P), !.
bovit(P,L,[P|L]).
gen(L):- kor((A,B),R), !, X is A-R, Y is B-R, genX(X,Y,L).
genX(X,_,[]):- jobbszel(X0), X>X0, !.
genX(X,Y,L):- X1 is X+1, genX(X1,Y,L2), genY(X,Y,L1), append(L1,L2,L).
genY(_,Y,[]):- teteje(Y0), Y>Y0, !.
genY(X,Y,L):- Y1 is Y+1, genY(X,Y1,L1), bovit((X,Y),L1,L).
% 10. feladat: gráf komplementerének kiiratása
:-use_module(library(lists)).
csucsok(G,Cs):- setof(X,E^Y^(member(E,G),azonos_el(E,X-Y)),Cs).
kompl(G):- csucsok(G,Cs), kompl(Cs,G).
kompl([X|Tobbi],G):- elek(X,Tobbi,G), kompl(Tobbi,G).
kompl([],_).
elek(X,[Y|Tobbi],G):- azonos_el(X-Y,E), member(E,G), !, elek(X,Tobbi,G).
elek(X,[Y|Tobbi],G):- write(X-Y), nl, elek(X,Tobbi,G).
elek(_,[],_).
% 11. Feladat: gráf csúcsainak
csoportosítása fokszámuk szerint
:- use_module(library(lists)).
azonos_el(P-Q,P-Q).
azonos_el(P-Q,Q-P).
csucsok(G,Cs):- setof(X,E^Y^(member(E,G),azonos_el(E,X-Y)),Cs).
fok(X,G,N):- findall(Y,(member(E,G),azonos_el(E,X-Y)),S), length(S,N).
csoportositas(G,Csop):- csucsok(G,Cs),
setof((N,NOszt),
setof(X,(member(X,Cs),fok(X,G,N)),NOszt),
Csop).
% 12. Feladat: legfeljebb K hosszú palindromák
legenerálása adott szókészletből
:-use_module(library(lists)).
szo(Szo):-member(Szo,[indul,agorog,aludni]).
palindr(Palindr,K):- Pd0=[], palindr(Pd0,Pd,K), atom_codes(Palindr,Pd).
palindr(Pd0,Pd0,_):- reverse(Pd0,Pd0).
palindr(Pd0,Pd,K):- szo(Szo),
atom_codes(Szo,L),
append(Pd0,L,Pd1),
length(Pd1,N),
N<K,
palindr(Pd1,Pd,K).