74 lines
3.0 KiB
TeX
74 lines
3.0 KiB
TeX
|
\documentclass[a4paper,fontsize=14bp]{article}
|
|||
|
|
|||
|
\input{../common-preamble}
|
|||
|
\input{../fancy-listings-preamble}
|
|||
|
\input{../bmstu-preamble}
|
|||
|
\setcounter{secnumdepth}{0}
|
|||
|
\numerationTop
|
|||
|
|
|||
|
\begin{document}
|
|||
|
\thispagestyle{empty}
|
|||
|
\makeBMSTUHeader
|
|||
|
|
|||
|
% номер, тема, предмет, ?а, кто
|
|||
|
\makeReportTitle{лабораторной}{2}{Логическое программирование в ограничениях}{Представление знаний в информационных системах}{}{Лычков И.И.}
|
|||
|
\newpage
|
|||
|
\thispagestyle{empty}
|
|||
|
\tableofcontents
|
|||
|
\newpage
|
|||
|
\pagestyle{fancy}
|
|||
|
\section{Цель}
|
|||
|
Цель работы – исследовать возможности языка логического программирования Пролог для анализа ситуаций.
|
|||
|
\section{Задание}
|
|||
|
11 предметов с весами [48, 30, 19, 36, 36, 27, 42, 42, 36, 24, 30] кг соответственно необходимо разложить по корзинам с ограничением по суммарному весу в одной корзине не более 100 кг. В предположении о том, что в наличии имеется достаточно корзин для размещения всех предметов, определите наименьшее количество корзин, которое удовлетворяет указанным требованиям.
|
|||
|
|
|||
|
\textbf{Подсказка:} Для перебора значений количества N используемых корзин в диапазоне StartN..StopN используйте предикат \code{between(StartN, StopN, N)}.
|
|||
|
|
|||
|
\textbf{Правильное решение:} Минимально нужно 4 корзины. Раскладка предметов по корзинам:
|
|||
|
\begin{lstlisting}[language=Prolog]
|
|||
|
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1].
|
|||
|
[0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0].
|
|||
|
[0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0].
|
|||
|
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0].
|
|||
|
\end{lstlisting}
|
|||
|
|
|||
|
|
|||
|
\section{Выполнение работы}
|
|||
|
Результат работы программы представлен на снимке экрана рис. \hrf{pic:result}.
|
|||
|
\begin{lstlisting}[language=Prolog,style=CCodeStyle]
|
|||
|
:- use_module(library(clpfd)).
|
|||
|
|
|||
|
mylength(Length, List):-
|
|||
|
length(List, Length).
|
|||
|
|
|||
|
scalar(List, L):-
|
|||
|
scalar_product(List, L, #=<, 100).
|
|||
|
|
|||
|
uberSum(Column):-
|
|||
|
sum(Column, #=, 1).
|
|||
|
|
|||
|
buckets(AllBuckets) :-
|
|||
|
Items = [48,30,19,36,36,27,42,42,36,24,30],
|
|||
|
between(1, 11, Count),
|
|||
|
length(AllBuckets, Count), maplist(mylength(11), AllBuckets),
|
|||
|
maplist(scalar(Items), AllBuckets),
|
|||
|
append(AllBuckets, V), V ins 0..1,
|
|||
|
transpose(AllBuckets, Column),
|
|||
|
maplist(uberSum(), Column),
|
|||
|
label(V).
|
|||
|
\end{lstlisting}
|
|||
|
|
|||
|
\begin{figure}[h]
|
|||
|
\centering
|
|||
|
\includegraphics[height=4cm]{1.png}
|
|||
|
\caption{Результат выполнения программы}
|
|||
|
\label{pic:result}
|
|||
|
\end{figure}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\end{document}
|
|||
|
|