Програмен код на Prolog
Генератор за подмножество
Публикувано от Ivelin Pavlov в Prolog Код, Код на 12 юни 2012г.
Генератор на пролог за подмножество на друго. Като също може да разпознае дали дадено множество е подмножество на друго, без повтарящи се символи.
Ако има повторения генератора ще зацикли на първия символ пр. [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
Публикувано от Ivelin Pavlov в Prolog Код, Код на 06 април 2012г.
Генератор без повторения на всички числа 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).
Задача на Пролог – генератори
Публикувано от Ivelin Pavlov в Prolog Код, Код на 06 април 2012г.
Дефиниция на ПРОЛОГ на предикат 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 – Брой на кратни елементи в списък, сума на по-малки елементи в списък
Публикувано от Ivelin Pavlov в Prolog Код, Код на 06 април 2012г.
Дефиниция на ПРОЛОГ на предикат 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 – Проверка за аритметическа прогресия
Публикувано от Ivelin Pavlov в Prolog Код, Код на 06 април 2012г.
Програма за проверка, дали елементите на даден списък образуват аритметическа прогресия на Пролог.\
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 by Алекс on 05.04.2024 - 7:40
Здравей,
Имам две задачи – едната на PROLOG, а другата на LISP,. Въпроса ми е мога ли да ти ги изпратя да ги погледнеш?
#2 by Ivelin Pavlov on 30.05.2024 - 10:04
Може да, скоро не съм работил с тях, но може да пробваме