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:lab4 [2019/07/20 10:02] andrey.suchkov [Общие сведения] |
courses:knowledge_representation_and_artificial_intelligence_systems:lab4 [2021/02/08 13:59] andrey.suchkov |
||
---|---|---|---|
Line 15: | Line 15: | ||
<code> | <code> | ||
(deftemplate status | (deftemplate status | ||
- | (slot peasant-location (type SYMBOL) (allowed-symbols shore-1 shore-2)) | + | (slot peasant-location (type SYMBOL) (allowed-symbols shore-1 shore-2)) |
- | (slot wolf-location (type SYMBOL) (allowed-symbols shore-1 shore-2)) | + | (slot wolf-location (type SYMBOL) (allowed-symbols shore-1 shore-2)) |
- | (slot goat-location (type SYMBOL) (allowed-symbols shore-1 shore-2)) | + | (slot goat-location (type SYMBOL) (allowed-symbols shore-1 shore-2)) |
- | (slot cabbage-location (type SYMBOL) (allowed-symbols shore-1 shore-2)) | + | (slot cabbage-location (type SYMBOL) (allowed-symbols shore-1 shore-2)) |
- | (slot parent (type FACT-ADDRESS SYMBOL) (allowed-symbols no-parent)) | + | (slot parent (type FACT-ADDRESS SYMBOL) (allowed-symbols no-parent)) |
- | (slot search-depth (type INTEGER) (range 1 ?VARIABLE)) | + | (slot search-depth (type INTEGER) (range 1 ?VARIABLE)) |
- | (slot last-move (type SYMBOL) (allowed-symbols no-move alone wolf goat cabbage))) | + | (slot last-move (type SYMBOL) (allowed-symbols no-move alone wolf goat cabbage))) |
</code> | </code> | ||
Исходным является состояние, в котором все действующие лица (и лодка) находятся на первом берегу (''shore-1''). Соответствующая (корневая) вершина в ДП не имеет родительской вершины, имеет глубину 1 и не имеет последнего перемещения (''no-move''). Таким образом, исходное состояние может быть представлено следующим фактом: | Исходным является состояние, в котором все действующие лица (и лодка) находятся на первом берегу (''shore-1''). Соответствующая (корневая) вершина в ДП не имеет родительской вершины, имеет глубину 1 и не имеет последнего перемещения (''no-move''). Таким образом, исходное состояние может быть представлено следующим фактом: | ||
Line 27: | Line 27: | ||
(deffacts initial-positions | (deffacts initial-positions | ||
(status (search-depth 1) | (status (search-depth 1) | ||
- | (parent no-parent) | + | (parent no-parent) |
- | (peasant-location shore-1) | + | (peasant-location shore-1) |
- | (wolf-location shore-1) | + | (wolf-location shore-1) |
- | (goat-location shore-1) | + | (goat-location shore-1) |
- | (cabbage-location shore-1) | + | (cabbage-location shore-1) |
- | (last-move no-move))) | + | (last-move no-move))) |
</code> | </code> | ||
=== Операторы перехода в пространстве состояний === | === Операторы перехода в пространстве состояний === | ||
Line 44: | Line 44: | ||
//В правой части// правила должна порождаться новая вершина, являющаяся потомком текущей в случае применения данного оператора и устанавливаться ее параметры: глубина, новое местонахождение действующих лиц, ссылка на родительскую вершину и последнее перемещение. Новую вершину удобно порождать путем дублирования текущей с изменением значений некоторых параметров. Пример правила для перемещения крестьянина с волком: | //В правой части// правила должна порождаться новая вершина, являющаяся потомком текущей в случае применения данного оператора и устанавливаться ее параметры: глубина, новое местонахождение действующих лиц, ссылка на родительскую вершину и последнее перемещение. Новую вершину удобно порождать путем дублирования текущей с изменением значений некоторых параметров. Пример правила для перемещения крестьянина с волком: | ||
<code> | <code> | ||
- | (defrule move-with-wolf "Правило \"перемещение с волком\"" | + | (defrule move-with-wolf "Правило перемещения с волком" |
?node <- (status (search-depth ?num) ; фиксация адреса текущей вершины и ее глубины | ?node <- (status (search-depth ?num) ; фиксация адреса текущей вершины и ее глубины | ||
- | (peasant-location ?fs) ; фиксация текущего местонахождения крестьянина | + | (peasant-location ?ps) ; фиксация текущего местонахождения крестьянина |
- | (wolf-location ?fs)) ; волк на том же берегу, что и крестьянина | + | (wolf-location ?ps)) ; волк на том же берегу, что и крестьянина |
- | (opposite-of ?fs ?ns) ; связывание значения противоположного берега | + | (opposite-of ?ps ?ns) ; связывание значения противоположного берега |
=> | => | ||
- | (duplicate ?node ; создать новую вершину дублированием | + | (duplicate ?node ; создать новую вершину дублированием |
- | (search-depth =(+ 1 ?num)) ; установить ее глубину инкрементом текущей | + | (search-depth =(+ 1 ?num)) ; установить ее глубину инкрементом текущей |
- | (parent ?node) ; установить в качестве родительской вершины текущую | + | (parent ?node) ; установить в качестве родительской вершины текущую |
- | (peasant-location ?ns) ; установить новое местонахождение крестьянина | + | (peasant-location ?ns) ; установить новое местонахождение крестьянина |
- | (wolf-location ?ns) ; установить новое местонахождение волка | + | (wolf-location ?ns) ; установить новое местонахождение волка |
- | (last-move wolf))) ; установить тип последнего перемещения | + | (last-move wolf))) ; установить тип последнего перемещения |
</code> | </code> | ||
Для фиксации (привязки) текущего берега и связывания переменной ''?ns'' значением противоположного берега в левой части правила используется условный элемент ''(opposite-of ?fs ?ns)''. Значение переменной ''?ns'' используется в правой части правила для установки нового местонахождения персонажей в результате выполнения оператора. Для использования такого элемента необходимо заранее определить отношение ''opposites-of'' между берегами с помощью конструкции: | Для фиксации (привязки) текущего берега и связывания переменной ''?ns'' значением противоположного берега в левой части правила используется условный элемент ''(opposite-of ?fs ?ns)''. Значение переменной ''?ns'' используется в правой части правила для установки нового местонахождения персонажей в результате выполнения оператора. Для использования такого элемента необходимо заранее определить отношение ''opposites-of'' между берегами с помощью конструкции: | ||
Line 67: | Line 67: | ||
<code> | <code> | ||
(defrule wolf-eats-goat | (defrule wolf-eats-goat | ||
- | ?node <- (status (peasant-location ?s1) ; фиксируется адрес вершины и положение крестьянин | + | ?node <- (status (peasant-location ?s1) ; фиксируется адрес вершины и положение крестьянин |
- | (wolf-location ?s2&~?s1) ; волк и крестьянин на разных берегах | + | (wolf-location ?s2&~?s1) ; волк и крестьянин на разных берегах |
- | (goat-location ?s2)) ; коза на том же берегу, что и волк | + | (goat-location ?s2)) ; коза на том же берегу, что и волк |
=> | => | ||
(retract ?node)) ; удалить вершину | (retract ?node)) ; удалить вершину | ||
Line 148: | Line 148: | ||
else (printout t "Peasant moves with " ?thing " to " ?shore "." t)) | else (printout t "Peasant moves with " ?thing " to " ?shore "." t)) | ||
(if (eq ?shore shore-1) ; Если ?shore = shore-1 | (if (eq ?shore shore-1) ; Если ?shore = shore-1 | ||
- | then (bind ?shore shore-2) ;?shore = shore-2 | + | then (bind ?shore shore-2) ; ?shore = shore-2 |
- | else (bind ?shore shore-1)) ;?shore = shore-1 | + | else (bind ?shore shore-1)) ; ?shore = shore-1 |
(bind ?i (+ 1 ?i)))) ; ?i = ?i + 1 | (bind ?i (+ 1 ?i)))) ; ?i = ?i + 1 | ||
</code> | </code> |