−22
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
kobenate :: (MonadVoretion m)
=> Config
-> Disjunct
-> RuleZipper
-> m Disjunct
kobenate cfg d₀ z = uphill d₀ z
where
climb t x =
case parent x of
Just x' -> uphill t x'
Nothing -> return t
uphill t x =
case label <$> parent x of
Just (LinkAnd{}) -> do
i <- downhill' cfg $ reverse $ before x
j <- downhill' cfg $ after x
climb (i \++/ t \++/ j) x
_ ->
case label x of
MultiConnector{} -> do
m <- downhill cfg (tree x)
let t' = t \++/ m
climb t' x
_ ->
climb t x
downhill' :: (MonadVoretion m)
=> Config
-> [Link]
-> m Disjunct
downhill' cfg x = foldl (\++/) ([], []) <$> mapM (downhill cfg) x
downhill :: (MonadVoretion m)
=> Config
-> Link
-> m Disjunct
downhill cfg l0@(Node label subforest) =
case label of
Optional _ ->
ifR (_decay_optional cfg)
{-then-} (downhill cfg $ head subforest)
{-else-} (return ([], []))
MultiConnector _ ->
ifR (_decay_multi cfg)
{-then-} (do
a <- downhill cfg l0
b <- downhill cfg $ head subforest
return $ a \++/ b)
{-else-} (return ([], []))
LinkOr{} ->
downhill cfg =<< pickRandom subforest
LinkAnd{} ->
downhill' cfg subforest
Cost{} ->
downhill' cfg subforest
EmptyLink ->
return ([], [])
Link{_link=i} -> do
case _linkDirection i of
Plus -> return ([], [Left i])
Minus -> return ([Left i], [])
Метод вореции дерева методом вниз, вверх и опять вниз, но сбоку. В индексе храним смещение бата правил, зожатых в отдельный файл. Ворециируем любое подходящее правило из индекса и розжимаем дерево в зиппер. Находим пачку подходящих зипперов, см. http://govnokod.ru/20195, ворециируем любой из них. Вверх идём просто, ничего не ворецируя, ибо нужную кобенацию важно сохранить, а вот сбоку идём вниз, тут уж можно любую кобенацию брать.
Запостил: CHayT,
28 Июня 2016
gost 29.06.2016 18:56 # 0
CHayT 29.06.2016 19:17 # +6
bormand 29.06.2016 21:19 # +10
3_14dar 29.06.2016 21:34 # +5
inkanus-gray 29.06.2016 21:47 # +6
inkanus-gray 29.06.2016 21:38 # +5
gost 29.06.2016 22:15 # +4
CHayT 29.06.2016 22:24 # +2
roman-kashitsyn 29.06.2016 23:08 # +2
3_14dar 29.06.2016 23:13 # 0
gost 30.06.2016 11:41 # +3
guest8 18.08.2019 06:59 # −999