局面从哪里来

这三本书都在 dpxq.com 上,两本古谱是根据二十世纪八九十年代明清木刻本的注释重印本录入的。我们挖掘了它两个古谱书架上的每一部公有领域棋谱,共2,938局,并在告知网站站长之后,把能够逐着演示的那些作为研究发布在这里,每局都附有原棋谱的链接。图和着法是几百年前的;现代编者的每一条注释都留在 dpxq 上,因为那部分不该由我们转载。

一局棋谱到手时是两个字符串。《適情雅趣》第011局 群鼠争穴的局面是每个棋子两位数字,从黑方底线读起,着法列表用同样的坐标。两者在文件里都是一整行;这里把它们拆开,每组四个棋子:

[DhtmlXQ_binit]
72999999 59999957 22771799 99999941
12994299 30996099 68028229 48999999

[DhtmlXQ_movelist]
22204220 72320232 77706042 17373222
57362232 36443222 4432

[DhtmlXQ_comment0]
红弃双车,双炮胜
dpxq 提供的第011局棋谱,只保留承载局面、解法和书中结论(红方弃掉双车,靠双炮取胜)的三个标签。

把它在本站对局所用的同一套规则内核上重新走一遍,就得到一个局面和一条着法。这次重放首先检验的是棋谱,而不是书:一个解法记短了仍然能顺利重放,但录错的棋子通常会在某处产生非法着法,这些棋谱会被整局剔除,而不是截短。然后皮卡鱼逐一扫描每个局面,寻找与书中结论相矛盾的判断,引擎能在这里说出「这不是红胜」,然后到此为止。

这次扫描说不出解法是否唯一。那需要穷尽搜索:每一回合红方的每一步合法着法,黑方的每一种应着,一直搜到所称的步数为止。在这些局面上,二十个棋子、九到十三步的解法,每局只需几秒到几分钟。下面的整个审校在笔记本电脑上跑了几个小时。

什么算毛病

一个仍能成杀的解法可能有四种毛病。第二首着:另一个首着在同样着数内强制成杀,于是这张图有两个答案。双解:再往后,在黑方某种防守之后,红方有两种取胜续着。更快的杀法:书中印的是七着杀,而存在五着杀,这直接违反了题意。更长的杀法:书中对胜负的判断是对的,对着数的判断是错的,因为黑方有一步比所印着法更好的防守。

双解正是两种传统分歧的地方。西方国际象棋排局自十九世纪起就把它当作毛病。朱鹤洲评判排局的十字标准要求「新深妙多走少美无趣名」:新颖、深刻、巧妙、变化多、攻子都要走动、子少、图形美观、无闲子、有趣味、题名贴切。唯一性不在其中。

172局中有45局无瑕

书审校无瑕双解第二首着更快更长
適情雅趣 (1570)11128457521
渊深海阔 (1808)391012644
林幼如作品集(20世纪)22713100
十三步以内的连将杀排局,每局都做了穷尽求解:每一个首着,每一种防守之后的每一种取胜续着。每局只按最严重的毛病计一次。不在任何一列中的九局,是一局书中首着在所记步数内杀不了,以及五局红方能胜但超出搜索范围(分布在《適情雅趣》和《林幼如作品集》中),还有《渊深海阔》中的三局错谱。

双解才是重点,而且都不是勉强算数的情况。《適情雅趣》第011局 群鼠争穴是七着杀:双车都弃掉,由双炮和马完成其余部分。红方第六着书中走傌六进五,而在同一局面上傌六进七也能在同样着数内成杀。

书中着法走到红方第六着,然后把另一种杀法走出来。编者和读者都没有去找它,因为在这一传统里它从来不算毛病。研究里的这一章两种都收了。

第二首着才是排局作者会在意的。第015局 妙振兵铃以车将开局,六着成杀;把 d9 上的兵推到将旁边,同样六着成杀,只是同样的子换了一种排列。仅《適情雅趣》一书就有七局这样的情况。

第二首着走出来:不同的首着,同样六着成杀。

《適情雅趣》第108局 争舟走渡印的是七着杀,共十三步。红方第一着改用兵吃将旁边的士,兵四平五,六着就能成杀。172局中有9局存在比所印更快的杀法。

书中着法,红方第一着处另有分枝兵四平五:吃士,早一着成杀。

当棋谱本身录错时

《渊深海阔》第217局 疾诛文丑声称连将五着杀,所印着法也确实成杀。之所以成杀,是因为黑方第四着自己走进了杀局。黑方在那里还有另一步合法着法:车5退8,把原图中就停在 e2 的车调回 e10;走了这步之后,红方一步将军都没有,连将杀就此结束,任何不将军的着法也杀不了。

书中着法走到红方第四着,然后是棋谱没有给出的那一着:以车5退8代替士6进5。红方没有将可走了。

没有哪位编者会在红方必败的局面上印红胜,所以录入的这张图很可能不是原排局。错的是哪个子,机器可以帮忙回答:对图做每一种单子改动,看哪些能让书中自己的着法成为五着强制杀。154种改动中,有四种可以。其中三种涉及 e2 的黑车,第四种是在 e3 放一个黑卒,正好在那个车的线上。

remove the black chariot on e2
the black piece on e2 is a horse, not a chariot
the black piece on e2 is a soldier, not a chariot
black soldier on d2 belongs on e3
能恢复书中解法的每一种单子改动。三种是去掉 e2 的黑车,或把它换成较弱的子;第四种是用 d2 的卒挡住它的线。

我们把局面和着法用中文发给了维护 dpxq 棋谱的人,并附上我们的猜测:书中那个车原本是卒。他的回答是「古谱就有错呀」。他没有核对印本,所以这个车究竟是古书的错还是转录的错,仍无定论。如果你有《渊深海阔》的印本,要看的格子是 e2。

另外两局,第202局和第265局,情况更糟。没有任何单子改动能恢复其中任何一局,所以出错的不止一个子,或者着法列表也录错了。三局都按 dpxq 的记录原样留在《渊深海阔》的研究里,审校研究则收录了这一发现。

这三局是172局之内的。在整个语料库中,有34局棋谱被标为错谱:录入的图支撑不了旁边印着的结论。其中十局声称连将杀,九局在书中自己的着法之内就被驳倒,分布在四部棋谱中;每一局的搜索都比所记步数多走了六着,也找不到连将杀。它们单独收在一个研究里,链接在下面,按驳倒的干脆程度排序:第217局中红方一步将军都没有,最后一局里红方仍有十步将军,却都杀不了。

精确搜索报告没有强制杀时,排局本身有缺陷和棋谱录错看起来一模一样,而在根局面上做一次引擎评估,几秒钟就能区分两者。我们原本标为有缺陷的五个局面,这样一查就没问题:红方确实能强制成杀,只是比所印着法晚。

四大名局:没有一局不成立

七星聚会、蚯蚓降龙、野马操田和千里独行是江湖排局,自1801年的《百局象棋谱》起就争论不休。它们的结论是和棋,而不借助重复局面的规则,和棋是证明不了的。能检验的是这个结论会不会被打破,即某一方能否强制成杀。在这四局及其变体的二十九份棋谱中,搜索没有找到与书相矛盾的杀法。其中八份证明了双方在搜索深度内都杀不了;其余的,在得出结论之前,一方或双方的搜索预算就用完了。

《渊深海阔》所印的七星聚会:双车、一炮、三兵对一车、一象、四卒。书中着法共五十四步。在搜索范围内红方无法强制成杀;黑方这边,搜索在得出结论前就用完了预算。

审校先错了三次

上面的数字来自第四版审校。第一版检验的是不连将的排局,它在首着之后的局面上搜索时,当成了红方连走两步。结果报告190局中176局无瑕。这个数字毫无意义,因为每一次搜索都从错误的一方开始。

第二版把每一局都当成国际象棋排局里的“n着杀”来判。不连将的排局只声称红先胜,对这样的结论来说,第二首着和更快的杀法都不算毛病。那一轮算出的毛病大约有一半就此作废。这两个错误都出在不连将排局的审校里,那部分已经搁置,原因见下一节;上面的172局都是连将杀排局,着数本身就是书中结论的一部分。

第三个错误是没有先做上面说的引擎筛查,就直接跑精确搜索。有八局起初被判为排局本身有缺陷:其中五局是表中那些红方能胜但超出搜索范围的,另外三局是上面的错谱。

第四个错误出在协作杀里,也就是双方合作走成杀局的题。生成这些题的程序只检验将死,而象棋把困毙,即一方无子可动,同样判负。以困毙结束的着法也是一种解,所以我们当作唯一解发布的186道协作杀里,有22道含有生成程序看不到的解,最多的一道有64种。按困毙计算的复查程序已经写好,还没有上线。

四个错误,每一个都是我们本来知道、却没有写进工具的规则:轮到哪一方走,排局声称的是什么,录错的棋谱看起来和有缺陷的排局一样,以及困毙判负。

我们没有检查的部分

不是连将的排局,也就是语料库的大部分。一局宽紧杀在二十个子的局面上要走二十步以上,能算清九步题的穷尽搜索在那里算不完。证明数搜索能走得更远,但在长局上还是会算不完。上面的一切都只涉及连将杀排局。

这些都不是对这些排局作为作品的评价。《適情雅趣》里的双解,是按一个《適情雅趣》本来就不为之而写的标准算出的双解;让这些局面四百年来值得抄录的那种几何之美,丝毫不受这个计数影响。

逐着演示每一项发现九局被驳倒的棋谱古谱原书