\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}

