# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# 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 offensive 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.
# 'Y' is the anchor stone, a unique stone of color 'X' used by the pattern
# matcher to find the pattern.
# The patterns in this database are sorted into the following
# Axx Limiting moves on the fourth line
# A1xx Limiting moves on the third line
# A2xx Limiting moves on the second line
# A3xx Limiting moves on the first line
# A4xx Limiting moves in the center
# A5xx Eye reducing moves on the second line
# A6xx Eye reducing moves on the first line
# A7xx Eye reducing moves in the center
# A8xx Invade the eye space
# A11xx Reinforce the perimeter
# A12xx Kill or threaten a worm of the dragon
# A13xx Specific corner attacks
# A14xx Invasion patterns
# A16xx Specific edge attacks
# ACxx Threats to capture
# AExx Threats to destroy eyes
# ARxx Reverse sente attacking moves
#########################################################
# Limiting moves on the fourth line #
#########################################################
# sometimes sagari is better
# gf Reduced value. (3.1.14)
#########################################################
# Limiting moves on the third line #
#########################################################
# gf Not on second line without known support. See trevora:290. (3.1.15)
# nn Added constraint (3.3.14)
....? block on third line
# tm Constraint added (3.1.16)
#Pattern A232 is almost certainly better if this
#constraint fails (avoid empty triangle)
; (o_somewhere(a) || !o_somewhere(b))
O..o draw back --- the only move!
# gf Moved from A212. (3.1.9)
# gf Moved from A213. (3.1.9)
# gf New pattern. (3.1.14)
#########################################################
# Limiting moves on the second line #
#########################################################
; oplay_attack(*,a,a) || !oplay_attack(*,a,b,c,*)
# gf Pattern revised. (3.5.1)
?Oo second line block (needs a helper)
?Oo second line block (needs a helper)
# nn Modified (3.3.11) see A207d
?O.Yxx second line kosumi
;!x_somewhere(a) || attack(a)
# nn Removal candidate (3.3.13)
# Success rate in regressions : 2.61% (15/560)
# nn New pattern (3.3.11) penalty for being gote
?O.Yxx second line kosumi
# tm New Pattern (3.1.16)
# nn New Pattern (3.3.11)
# gf New pattern. (3.3.18)
# gf New pattern. (3.5.3)
# gf New pattern. (3.7.3)
# gf New pattern. (3.1.11)
?OYX sometimes more effective to just descend
# gf Increased value. (3.1.14)
?OYX sometimes more effective to just descend
# gf New pattern. (3.1.14)
.OYX sometimes more effective to just descend
;!xplay_defend_both(*,b,c,a,b)
..OO reverse sente sagari
;(xlib(a)==1 || lib(b)>2) && lib(A)<=3 && olib(e)>1
;&& oplay_attack(*,c,a,d,e,f,A)
;&& oplay_defend(*,c,a,e,*)
; (owl_escape_value(b) <= 0 && owl_escape_value(c) <= 0)
; || !oplay_attack(*,a,d)
# tm Modified (3.1.20) - added right hand ?s
????? back off to prevent jump
;lib(B)<=3 && oplay_attack(*,a,B)
???? block if X can't cut
?OY? descend to prevent hane and eye
.OY? descend to prevent hane and eye in sente
;xplay_attack(*,a,C) || !xplay_defend_both(*,a,b,a,C)
# gf New pattern. (3.1.9)
;owl_escape_value(a)>0 && !oplay_attack(*,a,b,*)
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
;owl_escape_value(a) + owl_escape_value(b) > 0
;owl_escape_value(a) + owl_escape_value(b) > 0
?Oo? stop escape along edge
;owl_escape_value(a)+owl_escape_value(b) > 0
; oplay_attack(*,a,b,c,c)
# gf New pattern. (3.5.4)
; xlib(d)<=2 && lib(e)>3 && oplay_attack(*,a,b,c,c)
# tm new pattern (3.1.13)
# Descend to attack. Possibly defend vulnerable stone.
xX defend vulnerable stone.
# gf Revised pattern. (3.5.7)
# tm new pattern (3.3.12)
# pp New pattern (3.3.18) See nngs4:370
??O. eliminate an eye in reverse sente
; (x_somewhere(a) || ! safe_omove(a)) && !xplay_defend(*,b,c,A)
# evand New pattern (3.3.20) See nngs4:570
oO?Y Jump down to enclose
o*XO capture one stone and limiting eye
# gf New pattern. See gifu03:303. (3.5.3)
;!oplay_disconnect(*,a,b)
# gf New pattern. (3.5.3).
;xplay_disconnect(*,a,a,c) && xplay_disconnect(*,b,b,c)
#########################################################
# Limiting moves on the first line #
#########################################################
# gf Revised pattern. (3.1.14)
?oOX? descend, but not on edge
# tm New Pattern (3.1.15)
xYxx? Monkey Jump to reduce eye space
#########################################################
# Limiting moves in the center #
#########################################################
O..? block strongly if possible
; oplay_defend_both(*,a,*,b) && !oplay_attack(*,a,b)
# identical to A401, but lower value if bad cut aji
# see, for example, strategy4:182
O..? block strongly if possible
; oplay_defend_both(*,a,*,b)
# tm Modified (3.1.14) - doesn't make sense to match at edge.
O*.? fall back to confine
# gf Devalued. See also A403b. (3.3.13)
..* knight's move to block
; oplay_defend_both(*,a,b,c,A,b) && oplay_defend_both(*,b,a,d,*,A)
# gf More specific pattern and constraint. (3.3.13)
..* knight's move to block
; && oplay_defend_both(*,a,b,c,A,b) && oplay_defend_both(*,b,a,d,*,A)
; (owl_escape_value(a)>0)||(owl_escape_value(b)>0)
; || (o_somewhere(c) && !safe_xmove(d)))
# tm New Pattern (3.1.17)
*.. center keima enclosure
; && (xplay_attack(b,c,*,d,d) || !xplay_defend(*,b,d,e,e))
# gf New pattern. (3.7.1)
# gf Added constraint. (3.5.3)
;!(o_somewhere(a) && o_somewhere(b)) || x_somewhere(c)
# gf New pattern. (3.5.3)
# gf Revised constraint. (3.1.14)
?oOo seal the opponent in
;o_somewhere(a,b,c,d) && owl_escape_value(e) > 0
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
# gf Revised pattern. Necessary to constrain it harder. (3.1.14)
# gf Revised and devalued pattern. (3.1.15)
# nn Modified constraint (3.3.11)
??...??? try to stop escape into center
;&& ((o_somewhere(b,c,j) && o_somewhere(d,e,f,g,h,i))
; || (o_somewhere(j) && owl_escape_value(d)==0 && owl_escape_value(e)==0))
# nn New pattern (3.3.11)
# FIXME: there must be a way to prevent duplicate matches with A411
???..?? try to stop escape into center
;owl_escape_value(a)>0 && o_somewhere(f,g,h,i,j) && o_somewhere(b,c,d,e)
# nn New pattern (3.3.11)
;(o_somewhere(j) || (o_somewhere(i) && o_somewhere(k)))
;&& !oplay_attack(*,a,b,c,d,e,f,*) && !oplay_attack(*,a,b,e,f,*)
# gf Revised constraint. (3.1.14)
??xxx?? cap to prevent escape
; o_somewhere(a,b,c,d) && owl_escape_value(e)>0 && o_somewhere(f,g,h,i,j,k)
# nn New pattern (3.3.11)
;&& owl_escape_value(b)==0
;&& owl_escape_value(c)==0
;&& owl_escape_value(d)==0
;owl_escape_value(A)>0 && oplay_defend_both(*,b,*,c)
?Y.O prevent center escape
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
# gf New pattern. (3.1.10)
# gf Uncommented pattern (3.1.13)
# tm modified (3.1.22) (see 13x13:52 --decide-dragon K10)
; && oplay_defend_both(*,c,*,d)
# Same as A419, different anchor.
; && oplay_defend_both(*,c,*,d)
# gf New pattern. (3.1.12)
?X.o stop escape into center
;owl_escape_value(e)>0 && !xplay_defend_both(*,a,b,c,d)
# gf New pattern. (3.1.13)
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# ab New pattern. (3.3.10)
?Oo? prevent connection to another dragon
;&& !xplay_disconnect(*,a,b)
# same as A422; different anchor.
?Oo? prevent connection to another dragon
;&& !xplay_disconnect(*,a,b)
;(owl_escape_value(a) > 0)
# Same as A423; different anchor.
;(owl_escape_value(a) > 0)
# pp New pattern (3.3.18)
XYO? block and prevent opponent from playing double threat move
#spl added 3.5.1, counter part of D1348d
#########################################################
# Eye reducing moves on the second line #
#########################################################
?XX push in to eliminate eye
# gf New pattern. (3.5.3)
?XXX atari to eliminate eye or make ko
?OYX there is death in the hane
?O? destroy eye space and threaten to cut
o.Xx? undermine potential eye space
X.O destroy eye space by damezumari
;lib(A)<=3 && xlib(b) <= 2 && oplay_attack(*,b,b)
.XY.X destroy eyespace in reverse sente
# gf New pattern. (3.1.11)
# gf New pattern. (3.1.11)
.O?? attack eye shape and stop expansion
# tm New pattern. (3.1.15) (see trevora:620)
# This may be just too generic, though often useful.
# Added ??? rows, make sure not at upper edge.
# ab This is indeed too generic.
# gf Added constraint to make it slightly less generic. (3.5.3)
# See trevora:620,630 and gifu03:303 for relevant testcases.
;x_somewhere(b) || oplay_attack(a,b,a)
# tm New Pattern (3.1.15)
XOo| special edge position
; oplay_attack(*,W) && !oplay_attack(*,A,b,C,b)
# gf New pattern. See owl1:286. (3.3.17)
XXY*O sacrifice lunch and falsify eye
# evand New pattern (3.3.20)
oOXY. Begin to falsify eye in reverse sente
;!obvious_false_xeye(a) || !obvious_false_oeye(b)
#spl added (3.3.23) see nando:11
?OYXxx Prevent opponent from making an eye on the first line
# gf New pattern. (3.5.3)
#########################################################
# Eye reducing moves on the first line #
#########################################################
;!attack(a) && owl_proper_eye(b)
;&& (x_somewhere(c) || owl_proper_eye(c))
# tm - modified (3.1.15) (see trevora:170)
;owl_eyespace(b) && !attack(a)
;lib(c) > 1 && !oplay_attack(*,a,b,*)
# gf Split pattern. (3.5.3)
# gf Revised constraint. (3.5.4)
# gf Comment: A607a and A607b could now be merged again but I think
# it may be handy for later revisions to keep them apart.
XYO there is death in the hane
;owl_maxeye(b) > 0 && !oplay_attack(*,a) && !obvious_false_xeye(b)
# gf Split pattern and revised constraint. (3.5.3)
# gf Reordered constraint for better performance. (3.5.4)
.YO there is death in the hane
;owl_maxeye(b)>0 && !oplay_attack(*,a) && !obvious_false_xeye(b)
# gf New pattern. (3.1.12)
# gf Reordered constraint for better performance. (3.5.4)
xYO the push is also deadly
;owl_eyespace(b) && !oplay_attack(*,b,a)
# gf New pattern. (3.5.4)
# gf Comment: A607a and A607b could now be merged again but I think
# it may be handy for later revisions to keep them apart.
?XYO there is death in the hane
;&& ((o_somewhere(c) && owl_lunch(c))
; || (o_somewhere(d) && owl_lunch(d)))
;&& !oplay_attack(*,a) && !obvious_false_xeye(b)
xYO hane with atari on more than one stone
;lib(C)==2 && wormsize(C)>1 && !oplay_attack(*,a) && !obvious_false_xeye(b)
X.YO try to damage eyespace in sente
?Ox? placement where X cannot cut
oOY? threaten snapback to destroy eye
# gf New pattern. (3.1.15)
XYO? destroy eyespace when we can't capture
# tm New Pattern (3.1.15)
OXYXO attack shortage of liberties
# nn Removal candidate (3.3.13)
# Success rate in regressions : 0.75 % (2/268)
# tm New Pattern (3.1.15)
?XOo| special edge collapse
; && (!x_somewhere(b) || (x_somewhere(b) && o_somewhere(a)))
# tm New Pattern (3.1.15)
# tm New Pattern (3.1.17)
; oplay_defend_both(*,A,b,*)
#evand New Pattern. (3.3.18)
.YO push in to destroy eyespace
# gf Revised constraint. (3.5.3)
?YOo? threaten to make ko or nakade
;lib(A)<3 && owl_eyespace(*)
# gf New pattern. (3.5.3)
# Compare D704b. See nngs3:450.
xY.O half eye sometimes missed
; && (x_somewhere(b) || !safe_omove(b))
# gf New pattern. (3.5.5)
|....O monkey jump into the corner
# gf New pattern. (3.7.3)
#########################################################
# Eye reducing moves in the center #
#########################################################
?XX? push in to limit eyeshape
;owl_eyespace(a) && xlib(b) <= 2 && oplay_attack(*,b,b)
; (owl_topological_eye(a,A)<=2) && (owl_topological_eye(b,A)==2)
; (owl_topological_eye(a,A)==2)
; && ((owl_topological_eye(b,A)==2) || (owl_topological_eye(b,A)==3))
?Y* attack eye with sente
;owl_topological_eye(a,B)==3 && does_attack(*,B)
xX. half eye sometimes missed
; owl_topological_eye(a,A)==3
; && safe_omove(b) && safe_omove(*) && xplay_attack(*,b,b)
?Y* kill a half eye with an atari
; lib(a)==2 && owl_topological_eye(b,A)==3
OO? destroy potential eye
;!attack(b) && xplay_attack(a,b)
?XY? capture to spoil eyespace
# gf New pattern. (3.1.11)
# evand Modified. (3.3.18)
?*YX attack eye shape and possibly threaten to cut
;!owl_proper_eye(*) && !attack(a)
# gf New pattern. (3.1.12)
O*x destroy eye in reverse sente
# tm New Pattern (3.1.17)
# tm New Pattern (3.1.22) (see trevorc:1360)
# see related general defense pattern D309a
# gf New pattern. (3.3.20)
# gf Revised constraint. (3.5.2)
;owl_mineye(*)==1 && xlib(b)==2 && !oplay_attack(*,c) && !oplay_attack(*,a,b,b)
# gf New pattern. (3.3.20)
;xlib(b)==2 && !oplay_attack(*,c) && !oplay_attack(*,a,b,b)
# evand New pattern (3.3.20)
Y..x Bamboo connection to reduce eyespace
;(owl_eyespace(a) || owl_eyespace(c))
;&& oplay_attack(a,a) && xplay_attack(*,a)
;lib(A) == 3 && !obvious_false_xeye(d)
;&& oplay_defend(*,b,c,*) && oplay_defend(*,e,c,*)
;&& oplay_defend_both(*,c,b,d,e,b,e)
#########################################################
#########################################################
# These are patterns where a live stone #
# is played where the opponent might get #
# an eye. They do not include sacrifice #
#########################################################
; attack(A) && !oplay_attack(*,A)
.YO? connect out on first line
|.OYO avoid leaving ko by connecting on the outside
# This looks a little weird. /ab
X.Y safe invasion into eye
.Y? clamp to invade eyespace
#spl added 3.5.1 see century2002:80
# gf Revised constraint. (3.5.1)
OYO sacrifice to eliminate eye
;(!attack(a) && olib(d)>=3)
;|| (!attack(b) && olib(c)>=3)
# gf New pattern. (3.7.2)
X.. try to squeeze eyespace
;lib(B) == 3 && owl_big_eyespace(*) && olib(*)>2 && olib(a)>1
#########################################################
#########################################################
# These are patterns where a sacrifice stone #
# is played in the opponent's eye space to #
# prevent two eyes. Use the s (sacrifice) #
#########################################################
|OXYX connect corner ko to make nakade
;lib(a)==1 && lib(b)==1 && lib(c)<=2
;lib(a)<=2 && lib(b)==1 && lib(c)<=2
;lib(a) == 1 && lib(B) > 1
# gf Increased value slightly. (3.1.14)
# gf New pattern. (3.5.3)
;!o_somewhere(a) || !defend(a)
# gf New pattern. (3.5.3)
;!o_somewhere(a) || !defend(a)
|OYX? critical point, might kill
|X??? nakade if ko can be won
|.X? capture to form nakade
# gf Revised constraint. (3.5.3)
XYX| try nakade in corner
;!obvious_false_xeye(a) && owl_maxeye(*)>1
XY.X try sente eyeshape reduction
;lib(A)==2 && !safe_omove(b)
??Yx play inside to kill one eye
?X?? always worth considering
# gf New pattern. (3.1.14)
?X?? always worth considering
# evand New pattern. (3.3.20)
# evand New pattern. (3.3.20)
# gf New pattern. (3.7.1)
#########################################################
#########################################################
;(owl_escape_value(B)>0 || owl_escape_value(C)>0)
;&& !oplay_attack_either(*,*,a)
# Sometimes cut of small useless tail
# i.e.: gq -l games/niki.sgf -L 158 --decide-dragon S8 -o x.sgf
; !oplay_attack_either(*,*,a)
; !safe_omove(a) && !oplay_attack_either(*,?,a,a,c) && !oplay_attack(*,a,*)
; !safe_omove(a) && !oplay_attack_either(*,?,a,a,c)
;owl_escape_value(C)>0 && xplay_attack_either(*,a,a,b)
# gf Need to consider both directions. (3.3.13)
;owl_escape_value(C)>0 && xplay_attack_either(*,a,a,b)
# gf New pattern. (3.1.12)
XOY push out in reverse sente
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# tm Modified (3.1.22) (see trevorc:810)
;(owl_escape_value(a)>0 || owl_escape_value(b)>0)
XO*Y stop connection underneath
Y.O cut and capture to destroy eyespace
XOY stop connection underneath
;owl_escape_value(a)>0 || owl_escape_value(b)>0
; !safe_omove(a) && lib(b)>1
# tm New pattern. (3.1.13)
; && oplay_defend_both(*,A,b,c,b)
; && oplay_defend_both(*,A,b,b,*)
# gf New pattern. (3.1.14)
xx..Ox stop connection underneath
;x_somewhere(A,B) && owl_escape_value(A) + owl_escape_value(B) > 0
; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
; && oplay_defend_both(*,g,f,e,f,*)
; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
; && oplay_defend_both(*,g,f,e,f,*)
# gf New pattern. (3.1.22)
# Converse to D1376. See lazarus:114 for an example.
; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
; && ((x_somewhere(d) && xplay_attack_either(*,c,c,e))
; || (!x_somewhere(d) && !xplay_defend_both(*,c,d,c,e)))
# gf New pattern. (3.1.22)
# Converse to D1376. See lazarus:114 for an example.
; (owl_escape_value(A) > 0 || owl_escape_value(B) > 0)
; && ((x_somewhere(d) && xplay_attack_either(*,c,c,e))
; || (!x_somewhere(d) && !xplay_defend_both(*,c,d,c,e)))
# nn New pattern (3.3.11)
# gf Revised constraint, see owl1:354. (3.7.3)
X.*o threaten to cut and mess up opponent's shape
;&& (o_somewhere(b) || !oplay_attack(*,b,*))
# nn New pattern (3.3.11)
# nn New pattern (3.3.11)
.o.O cut / prevent escape
;!owl_goal_dragon(A) && !oplay_attack_either(*,b,c,d,e,c,e)
;&& (o_somewhere(f) || !oplay_attack_either(*,d,b,f,g,b,g))
# nn New pattern (3.3.11)
# FIXME: constraint is ugly
ooooo try to cut off and kill the moyo reducing stone
;(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) + (owl_escape_value(f)>0)
;+(owl_escape_value(g)>0) + (owl_escape_value(h)>0)
;+(owl_escape_value(i)>0) < 2
# gf New pattern. (3.3.17)
??O cut off from friendly stone
;!owl_goal_dragon(A) && !oplay_connect(*,A,B)
# evand New pattern. (3.3.18)
# evand New pattern. (3.3.18)
;oplay_disconnect(*,a,B,C)
# gf New pattern. (3.5.4)
# gf Revised pattern. (3.7.3)
YO.? connect along edge to strong dragon
;owl_strong_dragon(B) && !xplay_disconnect(*,A,B)
# gf New pattern. (3.5.4)
XO.o connect along edge to strong dragon
;owl_strong_dragon(B) && !xplay_disconnect(*,A,B)
#########################################################
# Reinforce the perimeter #
#########################################################
# Patterns where the perimeter is already in place #
# but has a defect which needs repair. #
#########################################################
#tm New Pattern (3.1.22) (see pattern D1100)
# gf Fixed diagram inconsistency. (3.1.23)
;owl_escape_value(c)>0 && xplay_attack_either(*,a,a,b)
; xplay_break_through(*,a,b,a,c) == WIN
; lib(b)<=4 && lib(c)<=4 && xplay_break_through(*,a,b,a,c) == WIN
# New Pattern (before 3.1.20 - when?)
# see strategy3:150 for wasted move.
O*O connect against threat
; vital_chain(A) && vital_chain(B)
; && !xplay_defend_both(*,A,B)
;!xplay_defend_both(*,a,b,a,c)
OYO connect to prevent double atari
; xplay_attack(*,a,B) && !oplay_defend(*,A)
# gf Added n classification. (3.3.20)
XO* connect against double threat
;!attack(A) && xplay_attack(*,a,b)
XOX* capture cutting stone to defend
;!attack(A) && attack(a) && !oplay_defend(*,B)
# tm Moved to owl_vital_apats (3.1.17)
# tm copied back from owl_vital_apats (3.1.22)
# suspect that vital_chain works differently called from there??? -tm
# see 13x13:52 --decide-dragon K10
# spl never on edge (3.3.23)
??? defend the surrounding chain
; vital_chain(a) && vital_chain(b)
; && !xplay_defend_both(*,a,b)
# gf New pattern. (3.1.9)
# tm Modified (3.1.17) - took away from edge
?? defend the surrounding chain
;lib(c)>2 && vital_chain(b) && vital_chain(c)
;&& oplay_attack(*,a,a) && !xplay_defend_both(a,b,c)
# nn Removal candidate (3.3.13)
# Success rate in regressions : 0.9 % (23/2562)
# tm New pattern. (3.1.17)
# tm Modified (3.1.20) - reduced value (see nngs:320)
.* defend the surrounding chain
;lib(c)>2 && vital_chain(b) && vital_chain(c)
;&& oplay_attack(*,a,a) && !xplay_defend_both(a,b,c)
?XO don't let defender capture to escape
;owl_escape_value(B) > 0 && does_defend(*,a)
; o_somewhere(a,b) && attack(c)
o..YO? connect underneath
?.x..| defend bottom while emphasizing top
# Strict speaking we should not need patterns
# gf New pattern. (3.1.9)
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# gf New pattern. (3.1.9)
;owl_escape_value(a)>0 || owl_escape_value(b)>0
# gf New pattern. (3.1.9)
# gf New pattern. (3.1.9)
;owl_escape_value(C)>0 && owl_goal_dragon(D) && !xplay_defend_both(*,a,b)
# gf New pattern. (3.1.11)
X*O don't let defender cut and capture to escape
;!xplay_defend_both(*,a,b)
# Same as A1117; different anchor.
Y*O don't let defender cut and capture to escape
;!xplay_defend_both(*,a,b)
# tm New pattern (3.1.17)
; attack(A) && !oplay_attack(*,A)
# tm New Pattern (3.1.17)
# analog to defense pattern D1348
# tm Modified (3.1.18) (see trevorc:100)
# tm Modified (3.1.22) (see trevorc:810)
Y*? cut off escape route.
;(owl_escape_value(a)>0 || owl_escape_value(b)>0)
;&& ((o_somewhere(E) || x_somewhere(E)) || owl_escape_value(a) < 0)
;&& !oplay_attack_either(*,c,D,*,D)
# tm New Pattern (3.1.20)
# see also Pattern D1361 (both this and that are too generic)
# see trevorc:550, trevor:1050
# gf Added constraint. (3.1.32)
O.O block to protect weakness
;!same_string(a,b) && (lib(a) <= 4 || lib(b) <= 4 || lib(c) <= 4)
# tm New Pattern (3.1.22)
# see -l games/trevor/auto/d02.sgf -L 142 --decide-dragon P2
# gf Revised constraint. (3.7.11)
;!owl_goal_dragon(b) && !oplay_connect(*,a,b)
# same as A1122 - different anchor.
# gf Revised constraint. (3.7.11)
;!owl_goal_dragon(a) && !oplay_connect(*,a,b)
# gf New Pattern. (3.7.11)
;lib(a) == 2 && !oplay_connect(*,a,b)
# tm New Pattern (3.1.22) (see D1376)
# FIXME: duplicate of A1016
; (owl_escape_value(a) > 0 || owl_escape_value(b) > 0)
; && xplay_attack_either(*,c,d,c,E)
# Same as A1123 - different anchor.
; (owl_escape_value(a) > 0 || owl_escape_value(b) > 0)
; && xplay_attack_either(*,c,d,c,E)
# tm New Pattern (3.1.22) (see nngs:770 decide-dragon K4)
# ab Revised constraint. (3.3.10)
;(owl_escape_value(c) > 0
; || owl_escape_value(b) > 0)
;&& oplay_defend_both(*,d,A,*)
# tm New Pattern (3.1.22) (see nngs:770 decide-dragon K4)
# gf Revised. Might still be too general. (3.5.4)
;(owl_escape_value(d) > 0
; || owl_escape_value(b) > 0
; || owl_escape_value(c) > 0)
;&& !oplay_defend_both(e,*,A,e)
# gf New pattern. (3.5.4) (see nngs:770 decide-dragon K4)
;(owl_escape_value(d) > 0
; || owl_escape_value(b) > 0
; || owl_escape_value(c) > 0)
;&& xplay_connect(e,*,e,A)
;&& oplay_disconnect(*,e,e,A)
# tm New Pattern (3.1.22) (see D1118)
xxx? defend threaten of escape
# tm New Pattern (3.1.23)
# gf Revised constraint. (3.5.3)
O*O prevent breakout & attack
; vital_chain(a) && vital_chain(b)
; && xplay_attack_either(*,a,b) && !xplay_connect(*,a,b)
# tm New Pattern (3.1.23) (see Pattern D1001)
# Note: there's no reason to cut the goal dragon up.
; (attack(A) != WIN || (wormsize(A)<=2 && does_attack(*,A)))
; && (!owl_goal_dragon(b) || !owl_goal_dragon(c))
# Same as A1127 - different anchor.
; (attack(A) != WIN || (wormsize(A)<=2 && does_attack(*,A)))
; && (!owl_goal_dragon(b) || !owl_goal_dragon(c))
# tm New Pattern (3.1.23)
; owl_escape_value(a) > 0
; && !oplay_attack(*,c,d,d)
# tm New Pattern (3.1.23) (see D1123)
# nn New pattern (3.3.11)
# FIXME: should be constrained
...o? to be considered in crosscut cases like this
# gf New pattern. (3.3.18)
;owl_strong_dragon(A) && !xplay_disconnect(*,A,B)
# gf New pattern. (3.3.18)
|.O?? save one lunch and make one a false eye
# evand New pattern. (3.3.20)
;owl_escape_value(a) + owl_escape_value(b) +
;owl_escape_value(c) + owl_escape_value(d) > 0
# evand New pattern. (3.3.20)
;owl_escape_value(a) + owl_escape_value(b) +
;owl_escape_value(c) + owl_escape_value(d) > 0
# pp New pattern (3.5.3). See trevorb:120.
# FIXME: is it better to do this algorithmically with owl boundaries?
# gf Added explicit anchoring. (3.5.3)
XOY prevent escaping by capturing
; lib(a) == 1 && owl_escape_value(B) > 0
# gf New pattern. (3.5.3).
YOX prevent escaping by capturing
; lib(a) == 1 && owl_escape_value(B) > 0
# gf New pattern. (3.5.3).
XOY prevent escaping by capturing
# gf New pattern. (3.5.3).
YOX prevent escaping by capturing
# gf New pattern. (3.5.3)
;owl_escape_value(A)>0 && !xplay_disconnect(*,A,B) && !oplay_connect(*,A,B)
# gf New pattern. (3.5.3)
;owl_escape_value(A)>0 && !xplay_disconnect(*,A,B) && !oplay_connect(*,A,B)
# gf New pattern. (3.5.3)
;owl_escape_value(a) + owl_escape_value(b) + owl_escape_value(c) > 0
# gf New pattern. (3.5.5)
# gf New pattern. (3.5.7)
;oplay_attack(b,d) && oplay_attack(*,a,a)
;&& oplay_attack(*,b,?,a,a) && !oplay_attack(*,b,c)
# gf New pattern. (3.7.4)
;owl_escape_value(A) > 0 && xplay_disconnect(*,A,B) != WIN
# gf New pattern. (3.7.4)
;owl_escape_value(B) > 0 && xplay_disconnect(*,A,B) != WIN
# gf New Pattern. (3.7.11)
# gf New Pattern. (3.7.11)
#########################################################
# Kill or threaten a worm of the dragon #
#########################################################
?O? capture one stone to rescue
; (lib(a)==1) && (lib(B)==1)
;wormsize(A)>3 && lib(A)==1
?*? capture 1 or two stones
;wormsize(A)<=3 && lib(A)==1 && olib(*) > 1
;wormsize(A)>3 && does_attack(*,A)
*Y kill one string, possibly with ko!
;wormsize(A)<=3 && does_attack(*,A)
;&& (olib(*) > 1 || ko(*))
# gf New pattern. (3.7.1)
?O? not always found as lunch defense
;attack(a) && !oplay_attack(*,a) && !oplay_defend_both(*,B,C)
#########################################################
# Specific corner attacks #
#########################################################
|..X? corner clamp, often resourceful
#tm - modified (3.1.15) (see ld_owl:152)
|..X? obligatory corner attack
# gf New pattern. (3.5.3)
# gf Revised constraint. (3.1.18)
|.YO throw in threatening to destroy two corner eye vertices
;lib(A)==2 && !obvious_false_xeye(b)
|XXY? try to kill corner formation
|XY.? try to kill corner formation
|XXY? try to make ko in corner
|Xx?? attack bent four in the corner
|.YxX try to damage corner eye space
;lib(a)>1 && !obvious_false_xeye(b)
|*X.Y try to make ko or bent four in the corner
|.Y.X better to kill without ko if we can
# gf New pattern. (3.3.13)
|.YX? try to kill corner formation
|.??Ooo attack 3-3 invasion
# gf Added constraint. (3.5.5)
|x.X? sometimes correct attack in corner
|.XO? attack corner eye space
|.XY? try to make ko in corner
|..X? try to make ko in corner
;lib(A) == 4 && attack(A) != WIN
;lib(A) == 2 && attack(A) != WIN
|.XO? critical point, might give ko
|.XO critical point, might kill
# gf New pattern. (3.1.11)
|.XO? critical point, might give ko
|X?? try to make nakade instead of playing ko
|X?? prevent throwin for ko
|X.X sometimes correct attack point
|XXO eye stealing move might kill
|..O.. even if another attack works, try this first
# This pattern could be generalized
+----- try to kill without ko
|xX?? almost certain life if defender plays here
|XX? take ko to maybe kill
;lib(A)<=3 && defend(a) != WIN
|*Y? capture to deny X trivial life
|xYx? make nakade or escape
;!x_somewhere(a) || (lib(B) <= 6)
;oplay_attack(a,a) != 0 && !oplay_attack(a,b)
# gf New pattern. (3.1.1)
;oplay_attack(a,c) != 0 || oplay_attack(a,a)
|XXYO very special pattern
;!oplay_attack(*,a,b,b) && oplay_defend(*,c,d)
|xXx strange things happen at the 1-2 point
# gf New pattern. (3.1.13)
# tm new pattern (3.1.14)
# gf New pattern. (3.1.14)
# tm modified (3.1.15) (cho1:150)
# tm new pattern (3.1.15) (see cho1:150)
# This pattern shouldn't be necessary. It's definitely a vital move
XXY? consolidate or destroy eyespace
# tm new pattern (3.1.15) (see cho1:160)
|.X.O special corner shape
# tm new pattern (3.1.15) (see cho1:200)
??Xx| important 1-2 attack.
# gf New pattern. (3.1.15)
# gf New pattern. (3.1.15)
|xX? fighting ko is only chance to kill
;lib(a)==1 && lib(B)<=3 && defend(a)!=WIN
# gf New pattern. (3.3.20)
|.O? only chance to kill, sometimes tesuji
# gf New pattern. (3.3.20)
|oO? only chance to kill, sometimes tesuji
# gf New pattern. (3.3.20)
|XXX? try to kill without ko
|OO?? better than capturing
# gf New pattern. (3.7.3)
# gf New pattern. (3.7.3)
;proper_eye(a) && oplay_defend(*,b,c,*)
#########################################################
#########################################################
# These are not ordinary owl attack patterns. #
#########################################################
# nn Increased value a bit (3.3.12)
Y...| don't let opponent live easily in the corner
#evand new pattern 3.3.13
#########################################################
#########################################################
# Necessary to have one O stone in the pattern to identify the goal.
# The helper is reused from a similar defense pattern.
?O fill outer liberty in two-step ko
;lib(A)==2 && olib(*)>1 && finish_ko_helper(A)
# Necessary to have one O stone in the pattern to identify the goal.
# The helper is reused from a similar defense pattern.
Y*O fill outer liberty in two-step ko
;lib(A)==2 && olib(*)>1 && finish_ko_helper(A)
OX? capture ko to stop escape
;owl_escape_value(A) > 0 || owl_escape_value(B) > 0
#Same as 1503 - differnt anchor.
OX? capture ko to stop escape
;owl_escape_value(A) > 0 || owl_escape_value(B) > 0
# nn New pattern (3.3.13)
# redundant, as long as A1107c isn't removed
OXXXO threaten to take an eye by ko
;!attack(a) && !xplay_defend(b,c)
#########################################################
# Specific edge attacks #
#########################################################
;!safe_omove(a) && oplay_defend(*,a,*) && !oplay_attack(*,b,c,c)
.YO? peep to destroy eyeshape
.YO? peep to destroy eyeshape
?XYO? peep to destroy eyeshape
?XYO? peep to destroy eyeshape
XYO? peep to destroy eyeshape
XYO? peep to destroy eyeshape
XYO? throw in to destroy eyespace
xXYO? atari to reduce eyespace, with further reduction as followup
# nn Removal candidate (3.3.13)
# Success rate in regressions : 0% (0/35)
# gf New pattern. (3.1.11)
;lib(A)==3 && !attack(b) && !oplay_attack(*,c,d,e,f,f)
# gf New pattern. (3.1.12)
;oplay_attack(*,a,b,c,d,e,e) && !oplay_attack(*,f)
# tm New pattern (3.1.15)
;lib(A) > 2 && !oplay_defend(*,?,B,?,C,?,D,e)
# tm New Pattern (3.1.17)
#########################################################
#########################################################
# pp New pattern (3.5.5).
:8,cs, threatens_to_capture(A), value(25)
; lib(A) == 2 && lib(B) > 1 && olib(*) > 1
#########################################################
# Threats to destroy eyes #
#########################################################
# pp New pattern (3.5.5).
|OXx threaten to destroy the eye in ko
:8,cs, threatens_eye(a), value(20)
; owl_proper_eye(a) && !attack(B)
#########################################################
# Reverse sente attacking moves #
#########################################################