Главная
»
Информационные системы
»
Представление знаний в ИС
»
Заданы списки простых делителей двух целых чисел. Вычислить наименьшее общее кратное этих чисел.
Заданы списки простых делителей двух целых чисел. Вычислить наименьшее общее кратное этих чисел.
Вариант 1 (выводит странные выходные данные):
% Bilet7
% Patched 14.01.13
% 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 (работает):
% Bilet7 Variant 2
% Patched 14.01.13
% 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).
Друзья! Приглашаем вас к обсуждению. Если у вас есть своё мнение, напишите нам в комментарии.