courses:knowledge_representation_and_artificial_intelligence_systems:lab4

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
courses:knowledge_representation_and_artificial_intelligence_systems:lab4 [2019/07/13 09:41]
andrey.suchkov [Общие сведения]
courses:knowledge_representation_and_artificial_intelligence_systems:lab4 [2020/08/27 09:51]
127.0.0.1 external edit
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 ?fs)  ; фиксация текущего местонахождения крестьянина
Line 50: Line 50:
   (opposite-of ?fs ?ns)  ; связывание значения противоположного берега   (opposite-of ?fs ?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 145: Line 145:
     (bind ?thing (nth ?i ?m))       ; ?thing = значение i-го слота мультислота ?m (тип перемещения)     (bind ?thing (nth ?i ?m))       ; ?thing = значение i-го слота мультислота ?m (тип перемещения)
     (if (eq ?thing alone) ​          ; Если ?thing = alone     (if (eq ?thing alone) ​          ; Если ?thing = alone
-       then (printout t "Farmer ​moves alone to " ?shore "​."​ t)  +       then (printout t "Peasant ​moves alone to " ?shore "​."​ t)  
-       else (printout t "Farmer ​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>​
 ===== Постановка задачи ===== ===== Постановка задачи =====
-Необходимо построить полное дерево поиска для задачи о фермере, которому необходимо переправить на другой берег реки волка, козу и капусту,​ разработать на продукционном языке CLIPS модульную программу решения данной задачи и проанализировать ход поиска решения,​ выполнив программу в пошаговом режиме.+Необходимо построить полное дерево поиска для задачи о крестьянине, которому необходимо переправить на другой берег реки волка, козу и капусту,​ разработать на продукционном языке CLIPS модульную программу решения данной задачи и проанализировать ход поиска решения,​ выполнив программу в пошаговом режиме.
 ===== Порядок выполнения работы ===== ===== Порядок выполнения работы =====
   - Построить полное дерево поиска для данной задачи.   - Построить полное дерево поиска для данной задачи.
Line 199: Line 199:
 ) )
 </​code>​ У правила распознавания целевого состояния должно быть установлено свойство автофокусировки:​ <​code>​ </​code>​ У правила распознавания целевого состояния должно быть установлено свойство автофокусировки:​ <​code>​
-(defrule SOLUTION:: goal-test+(defrule SOLUTION::​goal-test
   (declare (auto-focus TRUE))   (declare (auto-focus TRUE))
   ...   ...
courses/knowledge_representation_and_artificial_intelligence_systems/lab4.txt · Last modified: 2022/12/10 09:08 (external edit)