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/08/28 15:17] andrey.suchkov [Пакетный файл] |
courses:knowledge_representation_and_artificial_intelligence_systems:lab5 [2022/12/10 09:08] (current) |
||
---|---|---|---|
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> | ||