%% 3. Проверить, является ли один список декартовым произведением двух других.


% правила, умножающие список на число:

mult_list_on_chisl([],_,[]).              % выход из рекурсии

mult_list_on_chisl([H|T], Ch, Result):-   
  TMUL is H * Ch,                         % умножаем текущий элемент списка на число
  mult_list_on_chisl(T,Ch,TRes),          % умножаем хвост списка на это число
  append([TMUL],TRes,Result).             % добавляем результаты в список


% правило, получающее декартово произведение двух списков и позволяющее ответить,
% является ли список декартовым произведением двух списков.

mult_list_on_list(_,[],[]).               % выход из рекурсии

mult_list_on_list(List1,[H2|T2],Result) :-   
  mult_list_on_chisl(List1,H2,TRES),        % умножаем первый список на текущее число второго списка
  mult_list_on_list(List1,T2,TResMult),     % умножаем первый список на хвост второго списка
  append([TRES],TResMult,Result).           % добавляем результаты в конечный результат


% запускать так: mult_list_on_list(<первый список>,<второй список>,<их декартово произведение>).
% пример, являющийся истинной : mult_list_on_list([1,2,3],[1,2],[[1,2,3],[2,4,6]]). 