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/22 09:19]
andrey.suchkov
courses:knowledge_representation_and_artificial_intelligence_systems:lab4 [2020/08/27 09:51]
127.0.0.1 external edit
Line 17: Line 17:
   (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-locatio ​(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))
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 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>​
courses/knowledge_representation_and_artificial_intelligence_systems/lab4.txt · Last modified: 2022/12/10 09:08 (external edit)