This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
courses:knowledge_representation_and_artificial_intelligence_systems:lab5 [2019/07/18 12:28] andrey.suchkov [Варианты заданий] |
courses:knowledge_representation_and_artificial_intelligence_systems:lab5 [2019/08/28 15:17] andrey.suchkov [Пример решения задачи] |
||
---|---|---|---|
Line 87: | Line 87: | ||
* Общий вывод по проделанной работе. | * Общий вывод по проделанной работе. | ||
* Код программы. | * Код программы. | ||
- | ===== Пример решения задачи ===== | + | |
- | ==== Решение задачи в среде CLIPS ==== | + | |
- | <code text lab5.CLP> | + | |
- | ;;//Шаблон для блока, хранит размер , цвет, положение - в куче, в руке или помещен в башню | + | |
- | (deftemplate block | + | |
- | (slot size (type INTEGER)) | + | |
- | (slot place (type SYMBOL)(default heap)) | + | |
- | (slot color (type SYMBOL)) | + | |
- | ) | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//Шаблон для отношения, задающего порядок расположения кубиков в башне (для основания значения полей upper,lower не определено | + | |
- | (deftemplate on | + | |
- | (slot upper (type SYMBOL)) | + | |
- | (slot upper-size (type INTEGER)) | + | |
- | (slot lower (type SYMBOL)) | + | |
- | (slot lower-size (type INTEGER)) | + | |
- | (slot place (type SYMBOL)(default heap)) | + | |
- | ) | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//Действие, выполняемое в настоящий момент времени: поиск подходящего кубика или установка найденного на вершину башни | + | |
- | (deftemplate goal | + | |
- | (slot current-task (type SYMBOL)) | + | |
- | ) | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//задаем начальное состояние кучи блоков с кубиками | + | |
- | (deffacts bloxx | + | |
- | (block (size 10)(color blue)) | + | |
- | (block (size 20)(color red)) | + | |
- | (block (size 15)(color yellow)) | + | |
- | (block (size 10)(color green)) | + | |
- | (block (size 5)(color brown)) | + | |
- | (block (size 10)(color red)) | + | |
- | (block (size 12)(color yellow)) | + | |
- | (block (size 16)(color white)) | + | |
- | (block (size 18)(color black)) | + | |
- | ) | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//вывобит на экран информацию о блоке | + | |
- | (deffunction print-block(?color ?size) | + | |
- | (printout t " <[block] [color] = '" ?color "' [size] = '" ?size "'/>" crlf) | + | |
- | );;//конец deffunction print-block | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//вывобит на экран информацию о наибольшем блоке | + | |
- | (deffunction print-biggest-block(?color ?size) | + | |
- | (printout t crlf "Biggest block: ") | + | |
- | (print-block ?color ?size) | + | |
- | (printout t crlf ) | + | |
- | );;//конец deffunction print-biggest-block | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//Инициирует процесс поиска решения - устанавливает состояние системы "поиск кубика" | + | |
- | (defrule init-system | + | |
- | (initial-fact) | + | |
- | => | + | |
- | (assert (goal(current-task find))) | + | |
- | );;//конец defrule init-system | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//Ищет наибольший блок в куче | + | |
- | (defrule find-biggest | + | |
- | ?goal-ptr <- (goal (current-task find)) | + | |
- | ?block-ptr <- (block (size ?s1)(color ?cl1)(place heap)) | + | |
- | (not | + | |
- | (block | + | |
- | (size ?s2&: (> ?s2 ?s1)) | + | |
- | (place heap) | + | |
- | );;//end block | + | |
- | );;//end (not): нет блока большего по размеру чем данный | + | |
- | => | + | |
- | (modify ?block-ptr (place hand)) | + | |
- | (modify ?goal-ptr (current-task build)) | + | |
- | (print-biggest-block ?cl1 ?s1);;//вывести информацию о блоке | + | |
- | );;//конец defrule find-biggest | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//выводит блоки, находящиеся в куче | + | |
- | (defrule show-in-heap | + | |
- | (declare (salience 2000)) | + | |
- | (goal (current-task find));;//текущ задача - "поиск" | + | |
- | (block | + | |
- | (place heap) | + | |
- | (size ?sz) | + | |
- | (color ?cl) | + | |
- | );;//end block | + | |
- | => | + | |
- | (printout t "Block in the heap: ") | + | |
- | (print-block ?cl ?sz);;//вывести информацию о блоке | + | |
- | );;//конец defrule show-in-heap | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//Устанавливает блок в основание башни | + | |
- | (defrule set-basis | + | |
- | (declare (salience 1000)) | + | |
- | ?goal-ptr <- (goal (current-task build) );;//текущ задача - "строить" | + | |
- | ?block-ptr <- (block (place hand)(color ?col)(size ?sz) );;// есть блок в руке | + | |
- | (not | + | |
- | (block | + | |
- | (place tower) | + | |
- | );;//end block | + | |
- | );;//end (not): нет блока, находящегося в башне | + | |
- | => | + | |
- | (modify ?goal-ptr (current-task find) );;// перейти к поиску следующего | + | |
- | (modify ?block-ptr (place tower));;// установить блок в башню | + | |
- | (assert | + | |
- | (on | + | |
- | (place tower) | + | |
- | (upper ?col) | + | |
- | (upper-size ?sz) | + | |
- | (lower nil) | + | |
- | (lower-size 0) | + | |
- | );//end on | + | |
- | );;//добавить новый факт, соотвествующий помещениб выбранного блока на верх башни | + | |
- | );;//конец defrule set-basis | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//Устанавливает все последующие (после заложенного в основание) блоки | + | |
- | (defrule set-next | + | |
- | (declare (salience 1000)) | + | |
- | ?goal-ptr <- (goal (current-task build) );;//текущ задача - "строить" | + | |
- | ?block-ptr <- (block (place hand) (color ?color-up) (size ?sz-up));;// есть блок в руке | + | |
- | (block (place tower) (color ?color-t) (size ?sz-t) );;//сохранили цвет некоторого блока | + | |
- | (not (on (place tower)(lower ?color-t)(lower-size ?sz-t)));;//нет такого блока, который находится над данным | + | |
- | (on (place tower)(upper ?color-t)(upper-size ?sz-t)) | + | |
- | ?on-ptr <- (on | + | |
- | (place tower) | + | |
- | (upper ?color-t) | + | |
- | (upper-size ?sz-t) | + | |
- | );;//выберем блок в башне, на котором нет блока сверху, т.е. верхний блок | + | |
- | => | + | |
- | (modify ?goal-ptr (current-task find) );;// перейти к поиску следующего | + | |
- | (modify ?block-ptr (place tower));;// установить блок в башню | + | |
- | (assert | + | |
- | (on | + | |
- | (place tower) | + | |
- | (upper ?color-up) | + | |
- | (upper-size ?sz-up) | + | |
- | (lower ?color-t) | + | |
- | (lower-size ?sz-t) | + | |
- | );//end on | + | |
- | );;//добавить новый факт, соотвествующий помещениб выбранного блока на верх башни | + | |
- | );;//конец defrule set-next: | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//останавливает процесс поиска, когда в куче ничего не осталось | + | |
- | (defrule finish-process | + | |
- | (not (block (place heap)));;//нет ни одного блока в куче | + | |
- | ?goal-ptr <- ( goal (current-task ?task)) | + | |
- | => | + | |
- | (retract ?goal-ptr) | + | |
- | (printout t "Solution found" crlf "Order of the blocks from the lowest to the highest" crlf) | + | |
- | );;//конец defrule finish-process | + | |
- | ;;//------------------------------------------------------------------------------------------------------- | + | |
- | ;;//выводит решение после окончания поиска | + | |
- | (defrule show-build-process | + | |
- | (not (goal (current-task ?task) ));;//цель - показать решение | + | |
- | (on (place tower)(upper ?color-up)(upper-size ?sz-up) );;//находим блок на котором ничего не находится сверху | + | |
- | (not (on (place tower)(lower ?color-up)(lower-size ?sz-up) )) | + | |
- | ?on-ptr <- (on (place tower) (upper ?color-up)(upper-size ?sz-up) );;//возьмем адрес отношения, соотв. данному блоку | + | |
- | => | + | |
- | ;;//(printout t "Block: color = " ?color-up " size = " ?sz-up crlf) | + | |
- | (print-block ?color-up ?sz-up) | + | |
- | (retract ?on-ptr );;//удалим отношение, соотв. данному блоку, чтобы продолжить процесс вывода решения | + | |
- | );;//конец defrule | + | |
- | </code> | + | |
- | ==== Пакетный файл ==== | + | |
- | <code text lab5.BAT> | + | |
- | (load lab5.CLP) | + | |
- | (reset) | + | |
- | (run) | + | |
- | </code> | + |