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