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/22 09:19]
andrey.suchkov
courses:knowledge_representation_and_artificial_intelligence_systems:lab4 [2022/12/10 09:08] (current)
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 ?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>​
courses/knowledge_representation_and_artificial_intelligence_systems/lab4.1563787155.txt.gz · Last modified: 2022/12/10 09:08 (external edit)