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
courses:knowledge_representation_and_artificial_intelligence_systems:lab4 [2019/07/13 09:42]
andrey.suchkov [Постановка задачи]
courses:knowledge_representation_and_artificial_intelligence_systems:lab4 [2022/12/10 09:08] (current)
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 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>​
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.1563010974.txt.gz · Last modified: 2022/12/10 09:08 (external edit)