BMSTU/02-iskr-lab-03-report.tex

197 lines
13 KiB
TeX
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\documentclass[a4paper,fontsize=14bp]{article}
\input{settings/common-preamble}
\input{settings/fancy-listings-preamble}
\input{settings/bmstu-preamble}
\numerationTop
\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader
% ... работе, номер, тема, предмет, ?а, кто
\makeReportTitle{лабораторной}{№ 3}{Программирование наборов решений}{Представление знаний в информационных системах}{}{Лычков И.И.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Цель работы}
Получение практических навыков разработки логических программ на языке ASP программирования наборов решений.
\section{Условие логической задачи}
\subsection{Перевод}
У Ван Ли, торговца китайским антиквариатом и артефактами, недавно был отличный месяц, когда он продал четырем покупателям со всего мира — Финляндии, Италии, Японии и Соединенных Штатов, — которые были в состоянии очень хорошо заплатить. Четыре проданных предмета представляли собой редкие нефритовые фигурки (пряжка для ремня, дракон, кузнечик и лошадь), каждая из которых была вырезана из нефрита разных цветов (темно-зеленого, светло-зеленого, красного и белого). Каждая фигурка относится к разным китайским династиям (Цзин, Мин, Сун и Тан). Сможете ли вы подобрать для каждой статуэтки свой цвет и династию, а также указать родную страну каждого покупателя?
\begin{enumerate}
\item Редкий белый дракон (которого американка не купила) не происходил из династии Сун.
\item Изысканная пряжка для ремня (не имеющая оттенка зеленого) была создана в 618 году нашей эры для императора династии Тан.
\item Из трёх фигурок одна была куплена финном (это не дракон), одна из династии Цин (которая не досталась покупателю из Японии) и светло-зеленый предмет (который не был лошадью).
\item Американка отказалась как от кузнечика, так и от произведения династии Сун, поскольку ни один из них, по её мнению, не подходил к её домашнему декору.
\end{enumerate}
Определить: Товар -- Цвет -- Династия -- Страна покупателя
\subsection{Результат разбора условия задачи}
\begin{itemize}
\item \textcolor{red}{Страны}: Финляндия, Италия, Япония, Соединенные Штаты;
\item \textcolor{blue}{Цвета}: темно-зелёный, светло-зеленый, красный, белый;
\item \textcolor{teal}{Предмет}: пряжка для ремня, дракон, кузнечик, лошадь;
\item \textcolor{green}{Династии}: Цзин, Мин, Сун, Тан.
\end{itemize}
\textcolor{violet}{Фиолетовым цветом} в тексте выделены дополнительные отношения между переменными.
\subsection{Исходное}
Wan Li, a dealer in Chinese antiques and artifacts, had an excellent month recently when he made sales to four customers from around the world -- \textcolor{red}{Finland}, \textcolor{red}{Italy}, \textcolor{red}{Japan}, and the \textcolor{red}{United States} -- who were willing and able to pay very good prices. The \textcolor{violet}{four items} were rare jade figurines (\textcolor{teal}{a belt buckle}, \textcolor{teal}{dragon}, \textcolor{teal}{grasshopper}, and \textcolor{teal}{horse}), each carved from a \textcolor{violet}{different color} of jade (\textcolor{blue}{dark green}, \textcolor{blue}{light green}, \textcolor{blue}{red}, and \textcolor{blue}{white}). Each piece dates from a \textcolor{violet}{different Chinese dynasty} (\textcolor{green}{Ching}, \textcolor{green}{Ming}, \textcolor{green}{Sung}, and \textcolor{green}{Tang}). Can you match each figurine with its color and dynasty, and give the home country of each buyer?
\begin{enumerate}
\item The rare \textcolor{teal}{white dragon} (which the \textcolor{red}{American} \textcolor{violet}{didn't buy}) \textcolor{violet}{didn't come from} the \textcolor{green}{Sung} dynasty.
\item The exquisite \textcolor{teal}{belt buckle} (which \textcolor{violet}{wasn't any} \textcolor{blue}{shade of green}) was created in 618 A.D. for an emperor of the \textcolor{green}{Tang} dynasty.
\item \textcolor{violet}{Three of} the figurines were the one bought by the \textcolor{red}{Finn} (which \textcolor{violet}{wasn't} the \textcolor{teal}{dragon}), the one from the \textcolor{green}{Ching} dynasty (which \textcolor{violet}{didn't go to the buyer} from \textcolor{red}{Japan}), and the \textcolor{blue}{light green} object (which \textcolor{violet}{wasn't} the \textcolor{teal}{horse}).
\item The \textcolor{red}{American} \textcolor{violet}{decided against both} the \textcolor{teal}{grasshopper} and the piece from the \textcolor{green}{Sung} dynasty, neither of which she felt would match her home decor.
\end{enumerate}
Determine: Item -- Color -- Dynasty -- Country of buyer
\section{Решение}
\begin{enumerate}
\item Факты: страны, фигурки, цвета и династии.
\small
\begin{verbatim}
country(finland; italy; japan; states).
item(buckle).
item(dragon).
item(grasshopper).
item(horse).
color(dkgreen; ltgreen; red; white).
dynasty(ching; ming; sung; tang).
\end{verbatim}
\normalsize
\item Генерирующие (выбирающие) правила: каждая фигурка может быть одного цвета, принадлежать какой-то одной династии и быть купленной представителем какой-то одной страны
\small
\begin{verbatim}
{check_color(I, C) : color(C)} = 1 :- item(I).
{check_dynasty(I, D) : dynasty(D)} = 1 :- item(I).
{check_country(I, C) : country(C)} = 1 :- item(I).
\end{verbatim}
\normalsize
\item Глобальные ограничения: обязательно должны выполняться требования (описанные в тексте), а также из текста следует, что нет фигурок одинакового цвета, никто не купил две фигурки, от каждого временн\'{о}го периода была представлена только одна фигурка
\small
\begin{verbatim}
:- check_color(I1, C), check_color(I2, C), I1 != I2.
:- check_dynasty(I1, D), check_dynasty(I2, D), I1 != I2.
:- check_country(I1, C), check_country(I2, C), I1 != I2.
:- not rule1.
:- not rule2.
:- not rule3.
:- not rule4.
\end{verbatim}
\normalsize
\item Вспомогательные предикаты: поскольку правила не могут содержать одновременно и отрицание и переменную, такая логика должна быть выделена в отдельный предикат.
\small
\begin{verbatim}
ofDyn_notJapan(It, Dyn) :-
check_dynasty(It, Dyn), not check_country(It, japan).
ofDyn_notStates(It, Dyn) :-
check_dynasty(It, Dyn), not check_country(It, states).
isGrasshopper_notStates(It) :-
It == grasshopper, not check_country(It, states).
\end{verbatim}
\normalsize
\end{enumerate}
\section{Листинг разработанной программы}
\begin{lstlisting}[language=Prolog, style=CCodeStyle]
%%writefile program.lp
% <@\lh{dkgreen}{1. Факты}@>
country(finland; italy; japan; states). % <@\lh{dkgreen}{страны}@>
item(buckle).
item(dragon).
item(grasshopper).
item(horse). % <@\lh{dkgreen}{фигурки}@>
color(dkgreen; ltgreen; red; white). % <@\lh{dkgreen}{цвета}@>
dynasty(ching; ming; sung; tang). % <@\lh{dkgreen}{династии}@>
% 2. <@\lh{dkgreen}{Генерирующие правила}@>
% <@\lh{dkgreen}{1 цвет у фигурки}@>
{check_color(Item, Color) : color(Color)} = 1 :- item(Item).
% <@\lh{dkgreen}{из 1 династии}@>
{check_dynasty(Item, Dynasty) : dynasty(Dynasty)} = 1 :- item(Item).
% <@\lh{dkgreen}{продано в 1 страну}@>
{check_country(Item, Country) : country(Country)} = 1 :- item(Item).
ofDyn_notJapan(It, Dyn) :-
check_dynasty(It, Dyn), not check_country(It, japan).
ofDyn_notStates(It, Dyn) :-
check_dynasty(It, Dyn), not check_country(It, states).
isGrasshopper_notStates(It) :-
It == grasshopper, not check_country(It, states).
% 3. Глобальные ограничения
% <@\lh{dkgreen}{у двух фигурок не может быть один цвет}@>
:- check_color(Item1, Color), check_color(Item2, Color), Item1 != Item2.
% <@\lh{dkgreen}{у двух фигурок не может быть одна династия}@>
:- check_dynasty(Item1, Dynasty), check_dynasty(Item2, Dynasty), Item1 != Item2.
% <@\lh{dkgreen}{у двух фигурок не может быть один покупатель}@>
:- check_country(Item1, Country), check_country(Item2, Country), Item1 != Item2.
% <@\lh{dkgreen}{Редкий белый дракон (которого американец не купил)}@>
% <@\lh{dkgreen}{не происходил из династии Сун.}@>
:- not rule1.
% <@\lh{dkgreen}{Изысканная пряжка для ремня (не имеющая оттенка зеленого) была}@>
% <@\lh{dkgreen}{создана в 618 году нашей эры для императора династии Тан.}@>
:- not rule2.
% <@\lh{dkgreen}{Из трёх фигурок одна была куплена финном (это не дракон), одна из}@>
% <@\lh{dkgreen}{династии Цин (которая не досталась покупателю из Японии) и}@>
% <@\lh{dkgreen}{светло-зеленый предмет (который не был лошадью).}@>
:- not rule3.
% <@\lh{dkgreen}{Американец отказался как от кузнечика, так и от произведения}@>
% <@\lh{dkgreen}{династии Сун, поскольку ни один из них, по его мнению, не}@>
% <@\lh{dkgreen}{подходил к его домашнему декору.}@>
:- not rule4.
% 4. <@\lh{dkgreen}{Вспомогательные правила}@>
rule1 :- check_color(dragon, white), not check_country(dragon, states), not check_dynasty(dragon, sung).
rule2 :- check_dynasty(buckle, tang), not check_color(buckle, dkgreen), not check_color(buckle, ltgreen).
rule3 :- check_country(I1, finland), I1 != dragon, ofDyn_notJapan(I2, ching), check_color(I3, ltgreen), I3 != horse, I1 != I2, I1 != I3, I2 != I3.
rule4 :- isGrasshopper_notStates(I1), ofDyn_notStates(I2, sung), I1 != I2.
% 5. <@\lh{dkgreen}{Указания по отображению результата}@>
info(It,Col,Dyn,Cntr) :- check_color(It,Col), check_dynasty(It,Dyn), check_country(It,Cntr).
#show info/4.
\end{lstlisting}
\section{Результаты работы}
\begin{verbatim}
clingo version 5.2.2
Reading from program.lp
Solving...
Answer: 1
info(buckle,red,tang,states)
info(dragon,white,ching,italy)
info(grasshopper,ltgreen,ming,japan)
info(horse,dkgreen,sung,finland)
SATISFIABLE
Models : 1
Calls : 1
Time : 0.003s (Solving: 0.0s 1st Model: 0.0s Unsat: 0.0s)
CPU Time : 0.003s
\end{verbatim}
\section{Интерпретация работы программы}
Красная нефритовая пряжка для ремня династии Тан была куплена покупательницей из США;
Дракон из белого нефрита времён династии Цин был куплен покупателем из Италии;
Кузнечик из светло-зелёного нефрита династии Мин продан покупателю из Японии;
Лошадь из тёмно-зелёного нефрита династии Сун продан покупателю из Финляндии.
\end{document}