# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see #
# http://www.gnu.org/software/gnugo/ for more information. #
# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, #
# 2008 and 2009 by the Free Software Foundation. #
# This program is free software; you can redistribute it and/or #
# modify it under the terms of the GNU General Public License #
# as published by the Free Software Foundation - version 3, #
# or (at your option) any later version. #
# This program is distributed in the hope that it will be #
# useful, but WITHOUT ANY WARRANTY; without even the implied #
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR #
# PURPOSE. See the GNU General Public License in file COPYING #
# You should have received a copy of the GNU General Public #
# License along with this program; if not, write to the Free #
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor, #
# Boston, MA 02111, USA #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# The Owl defensive pattern database.
# Further documentation may be found in the Texinfo documentation
# First there is a pattern title of the form: Pattern [string]. The
# string is used for identifying the pattern while tuning or debugging.
# Then a block of the following characters representing the pattern
# x : your piece or empty
# If a pattern must not match at the edge of the board,
# an extra row of ?'s in the pattern may be added. (This
# will not add to the time taken to check the pattern.)
# In the second field (classification) the following pattern attributes
# are possible. Friendly stones are 'O', opponent stones are 'X'.
# s : "Sacrifice" pattern. Omit the usual check that an O stone here
# n : In addition to usual check that an O stone here cannot be
# captured, check also that an X move cannot be captured.
# B : This move is not connected to the goal dragon and should
# therefore not be included in the goal.
# b : This move is maybe not connected to the goal dragon and should
# therefore be included only after closer examination.
# a : This move connects all O stones in the pattern to the goal.
# The patterns in this database are sorted into the following
# Dxx Expanding moves on the fourth line
# D1xx Expanding moves on the third line
# D2xx Expanding moves on the second line
# D3xx Expanding moves in the center
# D4xx Expanding moves in the corner
# D5xx Defend one worm of the dragon
# D6xx Make eyeshape on the edge
# D7xx Make eyeshape in the center
# D8xx Make eyeshape in the corner
# D11xx Attack a defect in the perimeter
# DCxx Threats to capture
# DExx Threats to create eyes
# DRxx Reverse sente defending moves
attribute_map owl_defense
#########################################################
# Expanding moves on the fourth line #
#########################################################
; oplay_attack(*,a,b,c,c)
.X.. extend along the fourth line
#########################################################
# Expanding moves on the third line #
#########################################################
?XX? Push along third line
?Xx?? Slide from fourth to third line
;attack(a) && !oplay_attack(*,a)
?O.O* save two stones while extending
;attack(a) && !oplay_attack(*,a)
|..O? try before extension
X.OX? hanging connection on third line
# gf Added b classification. (3.3.17)
.....X. one space jump to live
?xX.. draw back on the third line
?X.? knight's move if safe
# gf Fixed diagram inconsistency. (3.1.23)
?*O.X extend on third line
# This is usually better than D213 when both match.
# This is usually better than D213 when both match.
??xxx? better to make a base than jump in the center
...... jump to maximum eyespace on third line
# tm New Pattern (3.1.17)
??*O? expand eye shape, not in corner
# tm New Pattern (3.1.20) (see trevorb:660)
?X.. split off weak stones
;oplay_attack(*,a,b,c) && !attack(c)
# gf New pattern. (3.5.3)
...X escape or build further on the edge
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# gf New pattern. (3.5.5)
|...X.X peep in the corner
#########################################################
# Expanding moves on the second line #
#########################################################
# tm Pattern revised. (3.1.13)
# tm Pattern revised. (3.1.14)
;!x_somewhere(A) || !defend(A)
# tm reduced value (3.1.22) (see nngs:710)
# db reduced slightly (3.1.8)
# tm reduced some more (3.1.22) (see nngs:710)
# tm New pattern (3.1.15)
?OO sente block on first line.
|..O try before hanging connection
# gf FIXME: This is not a second line move. Move the pattern.
??O??? capture one stone to improve eye space
;oplay_attack_either(*,a,b,c,a,c)
# tm Pattern revised. (3.1.13)
# tm Pattern revised. (3.1.17)
# gf FIXME: This constraint is weird. (3.1.23)
# tm Pattern added (3.1.14)
# Possible to sacrifice to gain tempo here.
xx...X. slide (usually inferior to play on third line)
?oo.x jump to enlarge eyespace
oo?x jump along second line
# gf New pattern. (3.5.3)
oo?x jump along second line
# tm Pattern revised. (3.1.13)
;xplay_attack(a,b,c) && !oplay_attack(*,a,b,c)
# gf New pattern. (3.1.12)
?oO threaten to escape and cut
;owl_goal_dragon(a) && owl_escape_value(b)>0
# gf New pattern. (3.1.13)
X.O. jump and threaten to cut, connect, or force
;owl_goal_dragon(a) && !oplay_attack(*,a)
# gf New pattern. (3.1.13)
;owl_goal_dragon(a) && !oplay_attack(*,a)
# gf New pattern. (3.1.14)
XOoo capture or threaten to capture, improving eyespace
# tm New Pattern (3.1.16)
# gf Not down to edge. (3.3.20)
# gf Not if it can be cut off. Constraint added. (3.5.3)
?OO...? expand along edge.
# tm New Pattern (3.1.20) (see nngs:1320 owl_does_attack L15 M17)
; ((owl_escape_value(c) > 0 || owl_escape_value(d) >0 || owl_escape_value(e)>0)
; && oplay_attack(*,a,b,a))
# gf New pattern. (3.1.23)
??O?? defend eye against edge descent tesuji
;lib(F)>=3 && owl_topological_eye(a,b)<=2 && !xplay_attack(c,d,e,c)
# evand New pattern. (3.3.18)
# gf New pattern. (3.5.3).
;oplay_disconnect(*,a,a,C) && oplay_disconnect(*,b,b,C)
#########################################################
# Expanding moves in the center #
#########################################################
# gf Revised pattern. (3.1.15)
# FIXME: This pattern looks way too general (see owl:23)
# The b classification inhibits the addition of * to the dragon.
XX.? hane to try to escape
???o keima to expand shape
;oplay_attack_either(*,a,b,c,a,c) && oplay_attack_either(*,b,a,d,b,d)
; oplay_attack(*,?,c,b,D)
# tm added b category (3.1.17)
# tm modified & increased value (3.1.20)
; oplay_attack(*,b,b) && oplay_attack(*,c,c) && safe_xmove(*)
# tm reduced value (3.1.20) (see dniwog:5)
# FIXME: Adding B attribute solve niki:14 - not sure why -tm.
# adding it breaks a lot, however (i.e. trevorb:590)
;oplay_attack(*,b) && oplay_attack(*,a,a)
# tm modified (3.1.23) (added b attribute)
; && !obvious_false_oeye(a)
;oplay_attack(*,a,a) && oplay_attack(*,b,b)
*.O hanging connection to make eye
; lib(a)>1 && safe_xmove(b) && oplay_attack(*,b,b)
# More worth if safe from atari.
# tm Reduced value (3.1.22) (see owl:153)
*.O hanging connection to make eye
; lib(a)>2 && lib(c)>2 && safe_xmove(b) && oplay_attack(*,b,b)
# gf Added n classification. (3.5.4)
OX? try to seal off some space
..X move out and separate
;does_attack(*,A) && does_defend(*,b)
OOXx descend - don't capture
#########################################################
# Expanding moves in the corner #
#########################################################
..O..| enclose corner to live
|.O?? isolate corner stone
?.O.| proceed into corner for almost certain life
?Oo.| proceed into corner for almost certain life
; o_somewhere(b,c)||!oplay_defend(*,a,b,c,d,c)
|ooOO? realize eyespace in corner
|..X?? easy life in corner
|ooO? slightly expand corner eyespace
#evand new pattern (3.3.13)
oO.X.| move to corner to make life
#########################################################
# Defend one worm of the dragon #
#########################################################
# The first constraint is necessary because the lower O stone
# may be short on liberties. It might work to replace it with
|*.O hanging connection to protect eyespace
; && !xplay_attack_either(a,a,c)
; && oplay_attack(*,b,a,b)
# gf New pattern. (3.7.1)
# See ld_owl:319. Cf. D1004b.
|o.O try to get second eye through ko
;&& oplay_attack(*,b,c,b)
# Don't apply this pattern on the edge. See patterns D505 and D506
# gf Revised constraint. (3.3.18)
?*.O hanging connection to defend and make eye
; lib(a)>1 && safe_xmove(b) && !obvious_false_oeye(b)
; && oplay_attack(*,b,b) && does_attack(b,c)
# gf Changed does_attack to xplay_defend for better ko handling. (3.3.13)
OOX hanging connection to defend and make eye
; lib(a)>1 && safe_xmove(b) && oplay_attack(*,d,b,d)
; && xplay_defend(b,c) != WIN
# Smaller value in this case since it leaves substantial aji. In
# particular we want to try the solid connection (pattern D44, value
# 80) before this pattern.
.OX hanging connection to defend and make eye
; lib(a)>1 && safe_xmove(b) && oplay_attack(*,b,b) && does_attack(b,c)
# FIXME: (see trevor:360)
# nn Fixed constraint (3.3.12)
# does_defend() doesn't return WIN
..*.. atari before defending
# gf New pattern. (3.1.14)
;lib(A)>1 && lib(B)>1 && lib(c)==2
# gf New pattern. (3.3.20)
?OOX? hanging connection to defend and make eye
#########################################################
# Make eyeshape on the edge #
#########################################################
# Moves that do not necessarily expand the eyeshape #
# but try to make what exists yield two eyes #
#########################################################
# tm modified (3.1.20) (see strategy4:203)
oOX? eye with reverse sente
# tm New Pattern (3.1.15)
oOX?? eye with reverse sente, avoid ko
;oplay_attack(*,a,a) && oplay_attack(*,b,b)
;oplay_attack(*,a,a) && oplay_attack(*,b,b) && oplay_attack(*,c,c)
oOOX descend to close eyeshape
;(!obvious_false_oeye(b) || oplay_attack(*,A))
#tm New Pattern (3.1.15) (see maeda:70)
OOOOOX make eye by threatening large capture
O.*O make an eye and threaten another, while preventing atari
XOX try to partition eyespace rather than defend
;lib(a) == 1 && !obvious_false_oeye(b) && !obvious_false_oeye(c)
OXO avoid nakade while probably securing eyes
;lib(A)==1 && lib(B)==1 && lib(C)==2
oOOX eat lunch in the right direction
# gf New pattern. (3.1.11)
ooO.X eat lunch in the right direction
;owl_eyespace(a) && does_attack(*,B)
??oOX get out of liberty shortage
xXOo forestall snapback threat, securing eye
oOo initiate ko to attempt for an extra eye
;oplay_defend(*,A) != WIN
# gf New pattern. (3.1.9)
ooOOo attempt to live without ko
XOo? secure eye shape against snapback threat
;lib(A)==2 && xplay_attack(*,b,b)
# higher value than D616 for owl.tst number 183 where this defense
??oOX?? secure one eye with ko
ooOX?? secure eye with ko
oOX?? take ko to make eye
oOX capture to defend and maybe make eye
XOo? defend eye from collapse
?O?? threaten two eyes simultaneously
*OX? solidify eye and threaten to make more on the edge
;!attack(A) && oplay_attack(*,b,b)
; !x_somewhere(a) || !x_somewhere(b)
O.?? Block on first line to make eye.
# gf New pattern. (3.1.14)
# gf Revised constraint. (3.3.6)
O*o prevent eye stealing capture
;lib(a)==1 && !obvious_false_oeye(b)
# tm New pattern. (3.1.15)
# special position - see ld_owl:188
# tm New pattern (3.1.15) (see maeda:100)
; oplay_defend(*,A) && oplay_attack(*,B,A)
# tm New pattern (3.1.15)
; !xplay_attack(*,*) && oplay_attack(*,A,A)
# tm New Pattern (3.1.15)
|xX? make an eye on the edge.
# tm New Pattern (3.1.15)
# gf This was classified as a 0 (zero) pattern. Removed class. (3.1.18)
# tm added b category (3.1.18)
; defend(A) && oplay_attack(*,A)
# tm New Pattern (3.1.15)
# tm New Pattern (3.1.15)
OOX? Eat lunch with snapback.
# tm New pattern (3.1.15)
OOoO? vital point for eye shape
# tm New pattern (3.1.15)
# only really useful if short of liberties.
; lib(A) < 4 && oplay_attack(*,B)
# tm New Pattern (3.1.15)
; !oplay_defend(*,a,B,c,D,e,F,a)
# tm New Pattern (3.1.15)
OOO.X special eye shape on edge.
# tm New Pattern (3.1.20) (see strategy4:171)
# FIXME: This is due to a defect in the eye space handing.
# This point should come through as a vital point.
; ko(b) && owl_topological_eye(*,A) > 2 && !obvious_false_oeye(d)
#evand new pattern 3.3.12
?o.x attempt to escape or make eyeshape by forcing.
# gf New pattern. See owl1:285. (3.3.17)
oO*X eat lunch without getting a false eye
# gf New pattern. (3.3.20)
?O*.o try to make eye on edge
;!obvious_false_oeye(a) && !oplay_attack(b,*,*)
# evand New pattern. (3.3.20)
;!obvious_false_oeye(a) || !obvious_false_oeye(b)
# tm New Pattern (3.1.22) (see trevord:910)
# gf Revised constraint. (3.5.3)
X*O? Extend side eye-space in sente
;&& oplay_attack(*,b,C) && !attack(C)
# gf New pattern. (3.5.5)
# gf New pattern. (3.5.3)
oOOo make one definite eye
# gf New pattern. (3.7.2)
OOX secure eye and capture lunch
;owl_proper_eye(a) && does_attack(*,B) && !obvious_false_oeye(B)
#########################################################
# Make eyeshape in the center #
#########################################################
# Moves that do not necessarily expand the eyeshape #
# but try to make what exists yield two eyes #
#########################################################
?*? half eye sometimes missed by optics
; (owl_topological_eye(a,B)>=2) && (owl_topological_eye(b,B)==2)
?X? half eye sometimes missed by optics
; (owl_topological_eye(a,B)==2)
; && ((owl_topological_eye(b,B)==2) || (owl_topological_eye(b,B)==3))
?O* defend half eye (reverse sente)
;owl_topological_eye(a,B)==3 && does_attack(*,B)
oO. half eye sometimes missed
; owl_topological_eye(a,B)==3
; && safe_xmove(b) && safe_xmove(*) && oplay_attack(*,b,b)
# gf Revised constraint. (3.1.15)
# gf Revised constraint. (3.1.23)
# pp Revised pattern. (3.3.18)
oO.? half eye sometimes missed
; (safe_xmove(b) || safe_xmove(*)) && oplay_attack(*,b,b)
; && (o_somewhere(c) || !safe_xmove(c))
O.X block to cut off one stone
?O* save a half eye against an atari
; lib(a)==2 && owl_topological_eye(b,B)==3
XX? make half eye with sente
?X?? make half eye with sente
oOOx eat lunch in the right direction
;olib(a)<=2 && does_attack(*,A)
# gf Revised constraint. (3.1.15)
OO* try to make center eye
;!owl_big_eyespace(a) && !obvious_false_oeye(a)
O? capture nakade, might give new possibilities
;lib(A)==1 && wormsize(A)>=3
?O capture nakade, might give new possibilities
;lib(A)==1 && wormsize(A)>=3
;owl_topological_eye(a,B)==3
O* defend against atari inside eyespace
; lib(a)==2 && xlib(*)>1 && owl_big_eyespace(*)
# gf New pattern. (3.1.15)
XO. defend against atari inside eyespace on edge
;xlib(a)>1 && owl_big_eyespace(a) && oplay_attack(*,a,a)
# gf New pattern. (3.3.20)
.X* defend against atari inside eyespace
;lib(a)==2 && lib(B)==3 && owl_big_eyespace(*)
# gf New pattern. (3.1.11)
;owl_eyespace(a) && !owl_big_eyespace(a)
# gf New pattern. (3.1.12)
oOXx eat lunch to make certain eye
# tm New pattern (3.1.14)
# tm New pattern (3.1.16)
# nn New pattern. (3.3.9)
# evand New pattern. (3.3.18)
;!obvious_false_oeye(b) && oplay_attack(*,A)
# gf New pattern. (3.7.9)
#########################################################
# Make eyeshape in the corner #
#########################################################
# Moves that do not necessarily expand the eyeshape #
# but try to make what exists yield two eyes #
#########################################################
O...| claim the corner to live
# We need this pattern because the optics can't be relied on coming up
# with it when it's vital. Taking it out should cause some failures
# in the ld_owl test suite.
|OO? defend eye in the corner
# This is kind of obscure, but sometimes D804 leads to a shortage of
# liberties, e.g. in the position
# After O playing on the 1-2 point, X fills an outer liberty and O dies.
# This pattern avoids that bitter fate.
# s category incorrectly necessary - see ld_owl:53
# see also trevor:590 for underlying problem.
# tm modified back (3.1.16)
|...O try to secure corner
|...o try to secure corner
|.*.O try to secure corner
;attack(A) && !oplay_defend(*,a,b,A)
;attack(A) && oplay_defend(*,a,b,A) != WIN
|.XOO life (but possibly unnecessarily small)
|.XOoo miai eyes or better
|ooO? miai eyes or better
# tm New Pattern (3.1.15) (see cho1:200)
|oO?? miai eyes or better
|oo? work around eyespace generation weakness
|.O? proper defense of L+1 shape
|.OO? proper defense of L+1 shape
|.OX important shape point
|.OX important shape point
;attack(a) && ! oplay_attack(*,a)
|O?? throw in to improve eye potential
;oplay_defend(*,A) != WIN
|O?? throwin risky, try to live without
|oo?? play ko to enlarge eyespace
|oXO? play ko to enlarge eyespace
|oO?? might be passive, but almost certain life
|o.O? often best way to capture lunch
|OOO? form false eye trying to at least get seki
|OOO? at least secure seki
|ooO threaten to make eyes in the corner
;!oplay_attack(*,a) && oplay_attack(*,B)
|ooo if nothing else works, make an eye in the corner
|.XX??? special corner shape
|ooO? block on 1-2 with atari
|OO?? special corner shape, setting up ko
# gf New pattern. (3.1.1)
|OO? special corner shape, setting up ko
# gf New pattern. (3.1.9)
|O?? throw in to improve eye potential
;oplay_defend(*,A) != WIN
# gf Revised pattern. (3.1.14)
# gf New pattern. (3.1.14)
# tm New Pattern (3.1.15) (see trevora:400)
|.*. Special corner pattern
# tm New Pattern (3.1.15)
# tm New Pattern (3.1.16)
??oO.| special corner defend at 2-2
# tm New Pattern (3.1.16)
# gf New pattern. (3.3.18)
|.X?? Capture lunch with threat to make second eye
;does_attack(*,A) && xplay_attack(b,*,c,A)
# gf New pattern. (3.5.3)
# gf New pattern. (3.5.5)
# gf New pattern. (3.5.5)
|OOOOO workaround lunch problem (the eye is not considered a unit)
# gf New pattern. (3.7.2)
|.OO partition corner eyespace to avoid bent four complications
;owl_proper_eye(a) && owl_proper_eye(b) && owl_big_eyespace(a)
# gf New pattern. (3.7.2)
# gf New pattern. (3.7.2)
# gf New pattern. (3.7.2)
#########################################################
#########################################################
# gf Added constraint. (3.3.20)
XO. stop connection under
#FIXME: D903 & D904 often both match, reducing the number
# of patterns available for other options. Perhaps reduce
# the value of one or the other?
XOX descend to prevent connection
XOX hane to prevent connection
*XOX clamp to prevent connection
# O dragons may not be amalgamated
# O dragons may not be amalgamated
# gf New pattern. (3.1.14)
O* stop capture inside eyespace, not ko
;lib(a)==1 && owl_eyespace(*) && olib(*) > 0
# gf New pattern. (3.1.15)
# gf New pattern. (3.1.15)
oo???? stop the monkey jump
#########################################################
#########################################################
O* prevent opponent's safe cut
; (wormsize(B) > 1 && wormsize(C) > 1)
; && safe_xmove(*) && !xplay_attack(*,a)
; lib(A) == 1 && wormsize(A) > 2
;!attack(a) || (wormsize(a)<=2 && does_attack(*,a))
# Smaller value if opponent can't cut.
# gf Revised constraint. (3.1.11)
; !attack(a) && xlib(*) > 1
# Notice similarity with D310a, D310b.
# tm reduced value (3.1.22) (see trevorc:1440)
?*.O hanging connection to protect eyespace
;lib(b)>1 && oplay_attack(*,a,a) && !xplay_attack_either(*,?,a,a,c)
# Less attractive when making empty triangle.
# gf Added n classification. (3.1.14)
# tm Modified constraint (3.1.16)
# tm Modified constraint (3.1.23)
# nn Modified constraint (3.3.11)
?*.O hanging connection to protect eyespace
;(lib(b)>1 && oplay_attack(*,a,a) && !xplay_attack_either(*,?,a,a,c))
;&& (!x_somewhere(D) || oplay_attack(*,a,D))
;&& (!legal_xmove(D) || oplay_attack(*,D,D))
# gf New pattern. (3.1.14)
oooo sometimes useful to partion eyespace on edge or in corner
.... repair shape in center
# gf Added n classification. (3.1.11)
# gf Revised constraint. (3.3.6)
;lib(a)>1 && lib(b)>1 && !attack(C)
# gf New pattern. (3.1.14)
# gf Revised constraint. (3.1.32)
;(owl_escape_value(a)>0 || owl_escape_value(b)>0) && lib(a)>1 && lib(b)>1
# gf Revised constraint. (3.1.14)
# gf Revised constraint. (3.3.20)
OXO connect underneath in sente
;lib(A) == 2 && lib(b)>1 && lib(c)>1 && !attack(A) && !oplay_disconnect(*,b,c)
#########################################################
# Attack a defect in the perimeter #
#########################################################
# gf Split and revised pattern. (3.5.5)
# gf Revised constraint. (3.7.9)
X* attack the surrounding chain
;vital_chain(A) && vital_chain(B) && !ko(*) && !oplay_defend_both(*,A,B)
# gf Split and revised pattern. (3.5.5)
X* attack the surrounding chain
;vital_chain(A)>1 && vital_chain(B)>1 && !oplay_defend_both(*,A,B)
; oplay_break_through(*,a,b,a,c) == WIN
# tm reduced value (3.1.16)
# gf Revised constraint. (3.5.3)
... create cutting points
;(lib(A)<=3 && olib(c)>2) || (lib(B)<=3 && olib(d)>2)
# nn New pattern (3.3.11)
..... create cutting points
;oplay_attack_either(*,a,B,a)
# The two O's may be in different dragons.
# Normally this is enough to live.
??o? cut off stone on second line
.O? hane, threatening capture
X.... surrounding chain collapses
; !oplay_defend_both(*,f,a,B,C) && oplay_attack(*,D) && !safe_xmove(e)
X*... surrounding chain collapses
;owl_goal_dragon(a) && !oplay_defend_both(*,B,C)
?O? capture left or right
; oplay_attack(*,A) && oplay_attack(*,B)
# may overlap with D1333 and D1335
?..?? cutting combination
;owl_goal_dragon(h) && lib(i)>1 && oplay_attack(*,a,b,c,d,e,f,g,e)
??O.? cutting combination, followup
;owl_goal_dragon(f) && lib(g)>1 && oplay_attack(*,a,b,c,d,e,c)
??O.? cutting combination, followup
;owl_goal_dragon(d) && lib(e)>1 && oplay_attack(*,a,b,c,a)
??O.? cutting combination, followup
;owl_goal_dragon(c) && lib(d)>1 && oplay_attack(*,a,B)
XXOo capture (possibly with ko)
# tm New Pattern (3.1.15)
;oplay_attack(*,a,B) && wormsize(B) > 2
ooo? capture to defend and threaten escape
oOX.? might break through somewhere
;owl_escape_value(a)>0 || owl_escape_value(b)>0
ooX.? might break through
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# gf Split pattern. (3.3.17)
# gf Split pattern. (3.3.17)
# gf Split pattern. (3.3.17)
;oplay_attack_either(*,a,a,B)
# gf Repaired constraint. (3.3.6)
?O? Cut and maybe capture to make eye
;oplay_attack(*,A) || oplay_attack(*,B)
# tm modified (3.1.17) added b classification
;lib(A)==2 && owl_escape_value(c)>0 && !oplay_defend_both(*,A,B)
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
# gf Revised constraint and added B classification. (3.1.8)
OX. cut to capture something
;lib(c)>1 && oplay_attack(*,A) && oplay_attack(*,b,B)
# gf Added constraint and B classification. (3.1.8)
# gf Added B classification. (3.1.8)
...o set up multiple ataris
# db added B class (3.1.8)
..*o set up multiple ataris
; !safe_xmove(a) && lib(b)>1
OX cut to capture something and escape
;owl_goal_dragon(a) && owl_escape_value(b)>0
;&& oplay_attack(*,C) && oplay_attack(*,D)
# tm reduced value (3.1.18) (see trevorb:590)
; oplay_attack_either(*,A,B)
# gf New pattern. (3.1.9)
# tm new pattern (3.1.14)
# Give a very low value, unless add lots of constraints.
# tm new pattern (3.1.14)
O*. connect out, threaten cut
# gf New pattern. (3.1.14)
;lib(B)<=4 && owl_escape_value(c) + owl_escape_value(d) > 0
;&& oplay_attack_either(*,a,a,B)
# tm New Pattern (3.1.17)
; && (owl_escape_value(e) > 0 || vital_chain(A))
; && (owl_escape_value(f) > 0 || vital_chain(C))
; && oplay_attack_either(*,d,B,A)
# tm New Pattern (3.1.20) (see nngs:110)
# gf Added n classification. (3.3.20)
; (owl_escape_value(*) > 0) && !oplay_defend_both(*,a,b)
# tm New Pattern (3.1.20) (see nngs:1320 owl_does_attack L15 M17)
;(owl_escape_value(b) > 0
; || owl_escape_value(c) > 0
; || owl_escape_value(d) > 0)
# tm New Pattern (3.1.22)
# (see nngs:1810 owl_attack M17, result 3 L16)
; lib(a) == 2 || oplay_attack(*,a)
# pp New pattern (3.5.3). See nngs4:420.
# gf Fixed symmetry. (3.7.1)
?X? split boundary in hope that it will help;
*OX low value because it's not guaranteed it will
; does_defend(*,A) && !oplay_attack(*,B)
; && !same_string(B,C) && vital_chain(B) && vital_chain(C)
; && (oplay_attack(*,B) || oplay_attack(*,C)) && !oplay_connect(*,B,C)
# gf New pattern. (3.5.3).
;lib(A)==2 && lib(c)>1 && lib(d)>1 && oplay_attack(*,B)
# gf New pattern. (3.5.3).
; lib(A) == 1 && (owl_escape_value(b) > 0 || owl_escape_value(c) > 0)
# gf New pattern. (3.5.3).
########################################################
#########################################################
# Forcing moves that may improve the eyespace #
#########################################################
# gf Split pattern. (3.5.3)
XOo atari to build eyespace
# gf Split pattern and revised constraint. (3.5.3)
XOo atari to build eyespace
; lib(A)==2 && !oplay_defend_both(*,A,B)
# tm modified (3.1.22) (see owl:152)
;lib(A) <= 2 && (o_somewhere(B) || !attack(A) || defend(A))
;!attack(A) && oplay_attack(*,A) && !obvious_false_oeye(b)
;wormsize(A)>=3 && !attack(A) && oplay_attack(*,A) && !obvious_false_oeye(b)
?X? connect, cut, and threaten to capture
oOo capture, threatening to take again
# gf New pattern. (3.7.3)
o..x sacrifice a stone to gain tempo
;oplay_attack(*,a,a) && oplay_attack(*,b,b)
#########################################################
#########################################################
;owl_escape_value(c)>0 && oplay_attack_either(*,a,a,b)
;owl_escape_value(c)>0 && oplay_attack_either(*,a,a,B)
?X.? connect to another dragon
;(!owl_goal_dragon(f) || !owl_goal_dragon(g))
;&& (oplay_attack(*,a,b,c,d,e,e) || oplay_attack(*,a,b,c,e,d,d))
# gf New pattern. (3.3.7)
?Xo? connect to another dragon
;(!owl_goal_dragon(a) || !owl_goal_dragon(b))
;&& !oplay_disconnect(*,a,b)
# gf Revised constraint. (3.1.15)
;!(o_somewhere(d) && o_somewhere(e))
;&& (!owl_goal_dragon(b) || !owl_goal_dragon(c)) && oplay_attack(*,a,a)
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
;owl_escape_value(a) + owl_escape_value(b) > 0
# gf Not towards edge. (3.1.15)
;owl_escape_value(a) + owl_escape_value(b) > 0
;owl_escape_value(a) + owl_escape_value(b) > 0
# More positive shape than previous pattern.
;owl_escape_value(a) + owl_escape_value(b) > 0
#tm modified (3.1.15) (see trevora:400)
#tm added b constraint (3.1.17)
;(!x_somewhere(e) && !x_somewhere(d) && (owl_escape_value(a) > 0))
;|| owl_escape_value(b) > 0
;|| owl_escape_value(c) > 0
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
;owl_escape_value(a) + owl_escape_value(b) > 0
# It's rather pointless to match at the edge
# db generalized (3.3.14)
; owl_escape_value(a) > 0 || owl_escape_value(b) > 0
# gf New pattern. (3.3.17)
OX connect out to strong dragon
o..X move out, separate, and escape
# gf Too vague, reduced. (3.1.9)
# gf Still too vague, removed. (3.1.14)
# evand modified and reinstated, with lower value. (3.3.18)
??.... try to run towards center
;owl_escape_value(a) > 0 || owl_escape_value(b) > 0
;|| owl_escape_value(c) > 0 || owl_escape_value(d) > 0
;|| owl_escape_value(e) > 0
O*O connect to friendly dragon
;!owl_goal_dragon(a) || !owl_goal_dragon(b)
# tm New Pattern (3.1.20)
# gf Changed symmetry to accomodate for asymmetric constraint. (3.1.23)
O*O connect to friendly dragon
; (!owl_goal_dragon(A) || !owl_goal_dragon(B))
; && !xplay_attack_either(*,d,c,c,*)
# gf New pattern. (3.3.17)
O*O connect to strong friendly dragon
;owl_strong_dragon(a) || owl_strong_dragon(b)
O.O connect to friendly dragon by bamboo joint
;!owl_goal_dragon(a) || !owl_goal_dragon(b)
# gf New pattern. (3.3.17)
O.O connect to strong friendly dragon by bamboo joint
;owl_strong_dragon(a) || owl_strong_dragon(b)
# gf Constraint revised. (3.7.9)
OXO connect to friendly dragon by atari
;(!owl_goal_dragon(a) || !owl_goal_dragon(b)) && lib(C) <= 2 && lib(a) > 1
# without more context this is often an inferior
# solution (for example games/manner.sgf move 12).
# gf Removed safe_xmove(*) from constraint. This is redundant with n
# classification. (3.1.17)
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# tm New Pattern (3.1.17)
;(owl_escape_value(A) > 0
; || owl_escape_value(B) > 0
; || owl_escape_value(C) > 0)
O.O connect by bamboo joint to escape
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# gf Constraint revised. (3.7.9)
OXO connect to friendly dragon by atari to escape
;(owl_escape_value(a)>0 || owl_escape_value(b)>0) && lib(C) <= 2 && lib(a) > 1
;owl_escape_value(a)>0 || owl_escape_value(b)>0
o.... jump towards safety
?O.x break out into the center
;owl_escape_value(f)>0 && !oplay_defend_both(*,a,b,c,d,a,E)
?O.x break out into the center, followup
;owl_escape_value(e)>0 && !oplay_defend_both(*,a,b,C,D)
?O?x break out into the center, followup
?O? break out into the center, followup
;owl_escape_value(c)>0 && owl_goal_dragon(d) && !oplay_defend_both(*,A,B)
?O? break out into the center, followup
;owl_escape_value(c)>0 && owl_goal_dragon(d)
# This is not handled as a lunch because capturing only gives a false eye.
XOX break out into the center, followup
?O?? double atari to escape
;owl_escape_value(a)>0 && owl_goal_dragon(b) && lib(b)>1
?OO? break out into the center
;owl_escape_value(f)>0 && !oplay_defend_both(*,a,b,c,d,c,E)
?OO? break out into the center, followup
;owl_escape_value(d)>0 && !oplay_defend_both(*,a,b,a,C)
?O? break out into the center, followup
;(owl_escape_value(c)>0 || owl_escape_value(d)>0) && oplay_attack(*,a,a)
;&& !oplay_attack_either(*,b,a,*,a) && !oplay_attack_either(*,b,a,c,a)
?O?? break out into the center
X..? miai to make eye or escape into center
#tm reduced value (3.1.16)
;owl_escape_value(a) + owl_escape_value(b) > 0
#tm reduced value (3.1.16)
;owl_escape_value(a) + owl_escape_value(b) > 0
#tm reduced value (3.1.16)
;o_somewhere(c,d) && (owl_escape_value(a) + owl_escape_value(b) > 0)
#tm reduced value (3.1.16)
;owl_escape_value(a) + owl_escape_value(b) > 0
# gf Revised constraint. (3.1.32)
;lib(D)==2 && lib(c)>1 && lib(e)>1
;&& (owl_escape_value(c)>0 || owl_escape_value(e)>0)
;&& !oplay_disconnect(*,b,a,c,e)
?O.X break out into the center
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
OX? capture (possibly with ko)
O.? connect to friendly dragon to escape
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# gf New pattern. (3.3.17)
O.? connect to strong friendly dragon to escape
;owl_strong_dragon(a) || owl_strong_dragon(b)
# gf New pattern. (3.3.17)
Oxx connect to strong friendly dragon to escape
;(owl_strong_dragon(a) || owl_strong_dragon(b)) && !oplay_disconnect(*,a,b)
# gf New pattern. (3.3.17)
O.? connect to strong friendly dragon to escape
;owl_strong_dragon(a) || owl_strong_dragon(b)
?*.. capture lunch to escape (may be undervalued)
;&& (owl_escape_value(b) + owl_escape_value(c) + owl_escape_value(d)) > 0
O.OX escape or threaten to
;!owl_goal_dragon(a) && xplay_attack_either(b,c,d,b,d)
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
# nn Modified (3.3.13) see also D1356a
o.... jump towards safety
; (owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0)
; && !oplay_disconnect(*,d,*)
# nn New pattern (3.3.13)
# B attribute since cut possible
o.... jump towards safety
; (owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0)
; && oplay_disconnect(*,d,*)
# gf New pattern. (3.5.3)
?.... jump towards safety
; (owl_escape_value(a) + owl_escape_value(*) + owl_escape_value(b) > 0)
; && !oplay_disconnect(*,c,*)
o...o block/connect to escape
; owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
;(owl_escape_value(a) > 0 || owl_escape_value(b) > 0)
;&& oplay_attack_either(*,c,d,e,c,e)
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
??.. run while connecting
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
# too generic; see resultant A1121, see also trevor:1050
# gf Added constraint. (3.1.32)
# gf Split pattern. (3.5.7)
X.X push to expose weakness
;!same_string(A,B) && (lib(A) <= 4 || lib(B) <= 4 || lib(C) <= 4)
# too generic; see resultant A1121, see also trevor:1050
# gf Added constraint. (3.1.32)
# gf Split pattern and revised constraint. (3.5.7)
X.X push to expose weakness
;!same_string(A,B) && (lib(A) <= 4 || lib(B) <= 4 || lib(C) <= 4)
;&& !oplay_connect(*,A,C)
oOX? force the opponent to cut, exposing thinness
# gf Removed b class. (3.3.17)
;lib(a)>1 && owl_escape_value(b)>0
# gf New pattern. (3.1.13)
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# gf New pattern. (3.1.13)
# tm Added b class (3.1.20)
# gf New pattern. (3.1.14)
;owl_escape_value(a)>0 && !attack(B)
# gf New pattern. (3.1.14)
;owl_escape_value(a)>0 && does_attack(*,B)
# gf New pattern. (3.1.14)
oo..Xo connect underneath
;o_somewhere(a,b) && owl_escape_value(a) + owl_escape_value(b) > 0
# tm New pattern (3.1.15)
O?.? connect out with atari.
# tm New Pattern (3.1.16)
# gf Revised constraint. (3.1.22)
; (owl_escape_value(a) > 0 || owl_escape_value(b) > 0)
; && ((o_somewhere(d) && oplay_attack_either(*,c,c,E))
; || (!o_somewhere(d) && !oplay_defend_both(*,c,d,c,E)))
OX*.o hane into the open.
# tm reduced value (3.1.17)
# gf Revised constraint. (3.3.18)
; vital_chain(A) && vital_chain(B)
; && oplay_attack_either(*,A,B) && !oplay_connect(*,A,B)
# tm New Pattern (3.1.17)
; (owl_escape_value(A) > 0
; || owl_escape_value(B) > 0
; || owl_escape_value(C) > 0)
# tm (?) New Pattern (3.1.17)
; owl_escape_value(A) + owl_escape_value(B) + owl_escape_value(C) > 3
# tm New Pattern (3.1.19)
; (owl_escape_value(B) > 0 || owl_escape_value(a) > 0)
; && oplay_attack_either(*,a,a,C)
# tm New Pattern (3.1.19)
.O threaten attack and connect
; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
# tm New Pattern (3.1.20)
# tm added b attribute (3.1.23)
# gf No escape to second line, see 9x9:550. (3.7.8)
;(owl_escape_value(a) > 0)
; && !oplay_disconnect(*,*,B)
# tm New Pattern (3.1.22) (see strategy2:73)
# may not be necessary, but probably doesn't hurt.
# (doesn't work for strategy2:73; no matching stones are in dragon)
O.. escape or capture to escape
; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
; && (!x_somewhere(c) || oplay_attack_either(*,d,c,d))
# tm New Pattern (3.1.23)
; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
; && (oplay_attack(*,c,d,f,e) && oplay_attack(*,c,d,f,f))
# gf New pattern. (3.3.17)
OX.x connect along edge to strong dragon
;owl_strong_dragon(a) || owl_strong_dragon(b)
# gf New pattern. (3.3.17)
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# gf New pattern. (3.3.17)
;(owl_escape_value(c)>0 || owl_escape_value(d)>0 || owl_escape_value(e)>0)
;&& lib(B)==2 && olib(*)>=2 && !oplay_attack(*,a)
# gf New pattern. (3.3.17)
;(owl_escape_value(b)>0 || owl_escape_value(c)>0 || owl_escape_value(d)>0)
# gf New pattern. (3.3.18)
# gf Added a classification. (3.7.10)
;(owl_strong_dragon(a) || owl_strong_dragon(b)) && !oplay_disconnect(*,a,b)
???.O either capture or escape
; owl_escape_value(d) > 0
; && oplay_attack_either(*,a,b,c,d,B,c) && oplay_connect(*,a,b,c,d,?,A,C)
# gf New pattern. (3.5.3)
# gf Revised pattern. (3.7.2)
;owl_escape_value(a) > 0 && oplay_attack_either(*,b,C,b)
;&& !xplay_connect(*,a,d)
# evand New pattern. (3.7.1)
# sometimes forcing is better than the cut -- see gifu03:704
# pp New pattern, see kgs:500 (3.7.4)
O.O. secure escape connection by first threatening opponent
# Note: xplay_disconnect() to avoid generating this move when it is
; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
; && xplay_disconnect(A,C) && oplay_attack(*,a,D)
#pp New pattern, see kgs:500 (3.7.4)
; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
; && safe_xmove(*) && !oplay_disconnect(*,A,B)
# gf New pattern. (3.7.4)
;(owl_escape_value(a) > 0 || owl_escape_value(b) > 0)
;&& oplay_disconnect(*,a,b) != WIN
#########################################################
#########################################################
---- connect (don't fight ko)
;lib(A)>1 && lib(B)>1 && lib(C)>1
; (lib(A)>1) && (lib(B)>1)
; (legal_omove(*) && owl_topological_eye(a,B)==3)
; || (!legal_omove(*) && owl_topological_eye(a,B)==2)
;oplay_defend(*,A) != WIN
|X.O start or continue corner ko
;oplay_defend(*,A) != WIN
|X.O start or continue corner ko
;oplay_defend(*,A) != WIN
|X*O try to avoid corner ko
|.OX? defend corner eye space
?OO| throw in to set up ko or squeeze
;oplay_defend(*,A) != WIN
|O?? capture to finish ko
|O?? squeeze to finish ko
|oo??? try to live with double ko
# Generalizes D1412. Necessary to have one O stone in the pattern to
;lib(A)==1 && finish_ko_helper(A)
# Generalizes D1412. Necessary to have one O stone in the pattern to
;lib(A)==1 && finish_ko_helper(A)
# Generalizes D1413. Necessary to have one O stone in the pattern to
;lib(A)==2 && olib(*)>1 && squeeze_ko_helper(A)
# Generalizes D1413. Necessary to have one O stone in the pattern to
;lib(A)==2 && olib(*)>1 && squeeze_ko_helper(A)
oOX? take ko to preserve eye
oOX? take ko to preserve eye
;xplay_defend(*,a) != WIN && oplay_attack(*,a) == 0
# gf New pattern. (3.3.6)
|OO? throw in to make ko or better
# pp New pattern (3.3.12)
#########################################################
#########################################################
# pp New pattern (3.5.5).
??? threaten to cut off vital chain
:8,c, threatens_to_capture(A), value(35)
; o_somewhere(a,b,c) && vital_chain(A) && !oplay_defend(*,?,d,A)
# pp New pattern (3.5.5).
??? threaten to cut off vital chain
:8,c, threatens_to_capture(B), value(35)
; o_somewhere(a,b,c) && vital_chain(B) && !oplay_defend(*,?,d,B)
# pp New pattern (3.5.5) -- see ld_owl:316.
:8,c, threatens_to_capture(A), value(35)
; lib(A) >= 3 && lib(B) == 3 && olib(b) > 2
#########################################################
# Threats to create eyes #
#########################################################
# pp New pattern (3.5.5).
:8,c, threatens_eye(a), value(30)
# pp New pattern (3.5.5).
:8,c, threatens_eye(a), value(30)
# pp New pattern (3.5.5).
:8,c, threatens_eye(a), value(30)
; || (x_somewhere(b) ? !oplay_defend(*,b) : !oplay_defend(*,b,b))
# pp New pattern (3.5.5) -- see owl1:326.
:8,c, threatens_eye(a), value(30)
; || (x_somewhere(b) ? !oplay_defend(*,b) : !oplay_defend(*,b,b))
# pp New pattern (3.5.5) -- see owl1:326.
:8,c, threatens_eye(a), value(30)
#########################################################
# Reverse sente defending moves #
#########################################################
# pp New pattern (3.5.5) -- see ld_owl:316.
# FIXME: most likely need variations for other first line moves.
?.OX? prevent X's sente move at 'a'
:8,c, reverse_sente(a), value(30)
; owl_proper_eye(a) && !attack(B)