» » »

Заданы списки простых делителей двух целых чисел. Вычислить наименьшее общее кратное этих чисел.

Вариант 1 (by Вхитт, выводит какую-то хрень оО):
% Bilet7
% Patched by JamshyT 14.01.13
% Special for AISTd-31 :)
% To start type: jstart.
head(X,[X|L]).
tail(L,[X|L]).

member(X,L):-head(X,L).
member(X,L):-tail(T,L),member(X,T).

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

conk([],L,L).
conk([X|L1],L2,[X|L3]):-conk(L1,L2,L3).

sublist(S,L):-
  conk(L1,L2,L),
  conk(S,L3,L2).
           
un([],L,[]).
un(L1,L2,L3):- head(X,L1),
               member(X,L2),
               delete(X,L1,L11),
               delete(X,L2,L22),
               un(L11,L22,L33),
               L3=[X|L33],!.
un([H|T],L2,L3):-un(T,L2,L3).
                 
del_sub([],L,L).
del_sub([X|L],L1,L2):-delete(X,L1,L3),
                      del_sub(L,L3,L2).
                     
nok(L1,L2,X):- un(L1,L2,L3),
               setof(L11,del_sub(L3,L1,L11),[L111]),
               setof(L22,del_sub(L3,L2,L22),[L222]),
               conk(L111,L222,L4),
               conk(L4,L3,X).

proisv([X|[]],X).
proisv([H|T],X):-proisv(T,X2), X is H*X2.

predikat(L1,L2,X):-nok(L1,L2,Y),proisv(Y,X).
jstart:- write(' Vvedite spisok L1: '),nl,read(LJAM1),nl,
write(' Vivod spiska L1= '),
write(LJAM1),nl,
write(' Vvedite spisok L2: '),nl,read(LJAM2),nl,
write(' Vivod spiska L2= '),
write(LJAM2),nl,
predikat(L1,L2,Z),
write(Z).
Вариант 2 (by Джамшут, работает):
% Bilet7 Variant 2
% Patched by JamshyT 14.01.13
% Special for AISTd-31 :)
% To start type: jstart.
nod(X,Y,Y):-Y=<X,0 is X mod Y .
nod(X,Y,Z):-X<Y,nod(Y,X,Z).
nod(X,Y,Z):-X>=Y, M is X mod Y,nod(Y,M,Z).

nok(X,Y,Z):-nod(X,Y,Z1),S is X*Y,Z is S//Z1.

nok_sp([X],X).
nok_sp([M|[L|N]],X):-nok(M,L,Y),nok_sp([Y|N],X).
jstart:- write(' Vvedite spisok L (vse deliteli): '),nl,read(LJAM1),nl,
write(' Vivod spiska L= '),
write(LJAM1),nl,
nok_sp(LJAM1,Z),
write(Z).

Друзья! Приглашаем вас к обсуждению. Если у вас есть своё мнение, напишите нам в комментарии.

Поделиться

Оплаченная реклама

Дисциплины