Програмен код на Prolog

Генератор за подмножество

Генератор на пролог за подмножество на друго. Като също може да разпознае дали дадено множество е подмножество на друго, без повтарящи се символи.
Ако има повторения генератора ще зацикли на първия символ пр. [3,3,3,3,3,….]

member(X,[X|L]).
member(X,[Y|L]):-member(X,L).

submn([],_).
submn([X|L1],[Y|L2]):-member(X,[Y|L2]),submn(L1,L2),not(member(X,L1)).
?-submn(X,[3,1,2,4,5]),write(X),1<0.

А за разпознаване на множество дали е подмножество на друго със повторения може да използвате това:

member(X,[X|L]).
member(X,[Y|L]):-member(X,L).

submn([],_).
submn([X|L1],L2):-member(X,L2),submn(L1,L2).
?-submn([3,3,3,3,4,5],[3,1,2,4,5]).

Няма коментари

Генератор за Prolog

Генератор без повторения на всички числа z, които се представят във вида z = x^y за x,y > 1 естествени числа.

div_while_possible(X, X):-!.
div_while_possible(Z, X):-Z mod X =:= 0, Z1 is Z // X, div_while_possible(Z1, X).

Да се напише генератор gen_list(+M,+N,-L) на всички строго растящи редици от естествени числа от M до N включително. Допуска се и празната редица. Задачата има поне три различни по идея решения.
Упътване: подсписъци на списък, използване на between, рекурсивно свеждане към задачата за M+1 и N.

int(0).
int(X):-int(Y), X is Y + 1.

between(X, Y, X):- X =< Y.
between(X, Y, Z):- X < Y, X1 is X + 1, between(X1, Y, Z).

is_xy(Z):-Z1 is Z - 1, between(2, Z1, X), div_while_possible(Z, X), !.

gen_xy(Z):-int(Z), is_xy(Z).

Предикат find_list(+M,+N,-L), който намира списък от всички строго растящи редици от естествени числа от M до N включително. Допуска се и празната редица. Задачата има поне две различни по идея решения. Упътване: последователно пораждане на всички редици, рекурсивно свеждане към задачата за M+1 и N.

add_x(_, [], []):-!.
add_x(X, [H|T], [[X|H]|T1]):-add_x(X, T, T1).

find_list(X, X, [[], [X]]):-!.
find_list(X, Y, R):- add_x(X, L, L1), append(L1, L, R).

Няма коментари

Задача на Пролог – генератори

Дефиниция на ПРОЛОГ на предикат p(X,Y,N), който по дадени естествени числа X,Y връща в N:
Вариант А
броят на числата, които делят X, но не делят Y
Вариант Б
броят на общите делители на X и Y
б) Да се напише генератор без повторения на множеството
Вариант А
{ (x,y) | x>=1, y>=1 и броят на числата, който делят X, но не делят Y е точно Y }
Вариант Б
{ (x,y) | x>=y и броят на общите делители на X и Y е точно 5 }
Време за работа – 2 часа.

int(0).
int(X):-int(Y), X is Y + 1.

between(X, Y, X):- X =< Y.
between(X, Y, Z):- X < Y, X1 is X + 1, between(X1, Y, Z).

ph(X, X, _, 0):-!.
ph(X, _, D, 0):- D > X, !.
ph(X, Y, D, N):- D =< X, X mod D =:= 0, Y mod D =\= 0, !, D1 is D + 1, ph(X, Y, D1, N1), N is N1 + 1.
ph(X, Y, D, N):- D =< X, D1 is D + 1, ph(X, Y, D1, N).

zad2_p(X, Y, N):- ph(X, Y, 2, N).

zad2_gen_xy([X, Y]):-int(X), between(1, X, Y), zad2_p(X, Y, Y).
?-zad2_p(17,12,X),write(X).

Няма коментари

Prolog – Брой на кратни елементи в списък, сума на по-малки елементи в списък

Дефиниция на ПРОЛОГ на предикат p(X,L,N), който по даден списък от естествени числа L и естествено число X връща в числото N:

броят на тези елементи на L, които са кратни на X

p(X,[],0).
p(X,[Y|L],N):-Y mod X =:= 0, p(X,L,N1), N is N1+1.
p(X,[Y|L],N):-Y mod X > 0, p(X,L,N).
%?-p(4,[1,4,6,16,9,4],X),write(X),nl.
сумата на тези елементи на L, които са <= X
p(X,[],0).
p(X,[Y|L],N):-Y =< X, p(X,L,N1), N is N1+Y.
p(X,[Y|L],N):-Y > X, p(X,L,N).
?-p(12,[1,4,6,16,9,4],X),write(X),nl.

Няма коментари

Prolog – Arithmetic progression – Проверка за аритметическа прогресия

Програма за проверка, дали елементите на даден списък образуват аритметическа прогресия на Пролог.\

aritmethmeticProgression([X,Y|[]],D):- D =:= Y-X.
aritmethmeticProgression([X,Y|L],D):- D =:= Y-X, aritmethmeticProgression([Y|L],D).
arithProgression([X,Y|[]]).
arithProgression([X,Y|L]) :-D is Y-X, ar([Y|L],D).
?-arithProgression([1,2,3,4,5])

или по-просто

aritm([X,Y]).
aritm([X,Y|[Y1|S]]):-aritm([Y,Y1|S]), X-Y=:=Y-Y1.

чрез сума на елементите на списък може да намерим, по даден списък от списъци от числа, дали неговите суми на списъци, дали образуват аритметична прогресия.
Това е задача от контролно по „Логическо Програмиране“, във ФМИ на СУ:
Да се дефинира на пролог предикат p(X), който по даден списък X = [X1,…,Xn] от списъци от числа (където n може да бъде 0) проверява дали сумите на елементите на елементите на X (общо n на брой) образуват аритметична прогресия.

ar([X,Y|[]],D):-sum(Y,SY),sum(X,SX), D =:= SY-SX.
ar([X,Y|L],D):-sum(Y,SY),sum(X,SX), D =:= SY-SX, ar([Y|L],D).
a([X,Y]).
a([X,Y|L]) :-sum(Y,SY),sum(X,SX),D is SY-SX, ar([Y|L],D).

sum([],0).
sum([X|L],N1):-sum(L,N), N1 is N+X.
?-a([[1,2,3],[1,2,3,4],[1,2,3,4,4],[1,2,3,4,4,4],[1,2,3]]).

Втори начин:

p(X):-spspSum(X,L),aritm(L).
?-p([[1,2,3],[1,2,3,4],[1,2,3,4,4],[1,2,3,4,4,4]]).

spspSum([],[]).
spspSum([X|L],[S|Y]):-spspSum(L,Y),sum(X,S).
%?-spspSum([[1,2,3,4,5],[1,2],[2,5,7]],N),write(N).

aritm([X,Y]).
aritm([X,Y|[Y1|S]]):-aritm([Y,Y1|S]), X-Y=:=Y-Y1.

sum([],0).
sum([X|L],N1):-sum(L,N), N1 is N+X.
%?-a([[1,2,3],[1,2,3,4],[1,2,3,4,4],[1,2,3,4,4,4],[1,2,3]]).

Няма коментари

  • Страница 1 от 3
  • 1
  • 2
  • 3
  • >
  1. Няма коментари.
(will not be published)