197 lines
13 KiB
TeX
197 lines
13 KiB
TeX
|
\documentclass[a4paper,fontsize=14bp]{article}
|
|||
|
|
|||
|
\input{../common-preamble}
|
|||
|
\input{../fancy-listings-preamble}
|
|||
|
\input{../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}
|
|||
|
|