第 61 講:不飽和魚(yú)
接下來(lái)將為你介紹的是最后一種魚(yú)結(jié)構(gòu),之所以放在最后講,是因?yàn)檫@種結(jié)構(gòu)難度非常大,而且有一些基本定式無(wú)法滿足,所以刪數(shù)的方式和原理有一些別扭。
試想一下,我們之前學(xué)到的魚(yú)結(jié)構(gòu),定義域區(qū)域數(shù)和刪除域區(qū)域數(shù)是相同的,即一樣多的,這種結(jié)構(gòu)我們完全可以拿著它就可以用來(lái)刪數(shù),因?yàn)楫吘惯@種結(jié)構(gòu)刪數(shù)的原理已經(jīng)通過(guò)理論嚴(yán)格證明了,只要滿足全覆蓋和區(qū)域數(shù)一致的要求,就可以刪數(shù)。那么,有沒(méi)有可能讓定義域區(qū)域數(shù)比刪除域區(qū)域數(shù)多,或者刪除域區(qū)域數(shù)比定義域區(qū)域數(shù)多,但依舊全覆蓋的情況呢?那么如果有,又應(yīng)該如何刪數(shù)呢?本節(jié)就會(huì)討論全覆蓋要求下,定義域區(qū)域數(shù)和刪除域區(qū)域數(shù)不一樣多的時(shí)候的刪數(shù)情況。這種魚(yú)結(jié)構(gòu)稱為不飽和魚(yú)(Unsaturated Fish)。
Part 1 不飽和魚(yú)的形成和原理
在進(jìn)入正文技巧內(nèi)容的學(xué)習(xí)之前,我們先要掌握一個(gè)理論概念——秩(Rank)。這個(gè)詞匯實(shí)際上來(lái)自于線性代數(shù)里的矩陣的秩。這個(gè)詞被套用到魚(yú)結(jié)構(gòu)里,又有什么特殊的用法和用途呢?
1-1?秩的概念
我們?cè)谥暗膬?nèi)容里,提到過(guò)一個(gè)情況:自噬。在自噬的內(nèi)容里,我們說(shuō)到過(guò),當(dāng)魚(yú)的定義域和刪除域區(qū)域總數(shù)相同,而且還全覆蓋的時(shí)候,魚(yú)是可以刪數(shù)的;而如果魚(yú)的某一部分位于兩個(gè)刪除域區(qū)域的交集上,而位于一個(gè)定義域區(qū)域的交集的話,假設(shè)它填入后,它會(huì)同時(shí)使得兩個(gè)刪除域區(qū)域消失,一個(gè)定義域區(qū)域消失,致使定義域區(qū)域數(shù)少于刪除域區(qū)域數(shù),這樣的話,填數(shù)就不再平衡了,因?yàn)槎x域必須保證放入(n - 1)個(gè)數(shù),而刪除域卻必須保證最多放(n - 2)個(gè)數(shù)。這個(gè)最多放入的總個(gè)數(shù)竟然比必須放入的總個(gè)數(shù)還要少,所以出現(xiàn)了矛盾。
那么我們嘗試把這種說(shuō)法包裝一下。我們使用刪除域區(qū)域總數(shù)減去定義域區(qū)域總數(shù),減下來(lái)的這個(gè)差值稱為魚(yú)結(jié)構(gòu)的秩。那么上述內(nèi)容就變?yōu)檫@樣:當(dāng)某個(gè)結(jié)構(gòu)滿足全覆蓋要求,而且秩為0的時(shí)候,魚(yú)就可以刪數(shù)了;而如果某一處位置填入后導(dǎo)致秩為-1((n - 2) - (n - 1) = -1)的時(shí)候,出現(xiàn)矛盾。
這便就是秩的一個(gè)基本的敘述模式??梢钥吹?,有了這個(gè)說(shuō)法之后,前面的說(shuō)辭就會(huì)簡(jiǎn)化一些了。
1-2?所以,前文都是在講秩為0的魚(yú)?
是的,前文介紹的內(nèi)容都是秩為0的魚(yú)結(jié)構(gòu),因?yàn)閯h除域區(qū)域數(shù)和定義域區(qū)域數(shù)是相同的,所以減下來(lái)的差值必然為0。
但請(qǐng)注意,前文所說(shuō)的是“區(qū)域數(shù)相同,則秩為0”,而秩為0的結(jié)構(gòu)不代表一定能在所有刪除域進(jìn)行刪數(shù)。我們之前發(fā)現(xiàn)的所有秩為0的魚(yú)結(jié)構(gòu)是可以刪數(shù)的,這是因?yàn)榻Y(jié)構(gòu)涉及了全覆蓋,且每一個(gè)候選數(shù)都只被使用過(guò)一次,但有些時(shí)候,某個(gè)(或某些)候選數(shù)將會(huì)被重復(fù)使用,此時(shí)的分析將會(huì)更復(fù)雜一些,而這一點(diǎn)在后續(xù)的一些例題里會(huì)出現(xiàn)。
1-3 那么,秩可以為負(fù)數(shù)嗎?
可以從剛才的說(shuō)法里看到,一個(gè)結(jié)構(gòu)是不允許秩為負(fù)數(shù)的,哪怕剛才說(shuō)到的-1,也是不允許的;比如秩為-2則表示的是定義域區(qū)域數(shù)只有(n - 1)個(gè),但是刪除域區(qū)域數(shù)卻只有(n - 3)個(gè)。定義域保證結(jié)構(gòu)還必須填入(n - 1)個(gè)x,但刪除域保證最多還只能放(n - 3)個(gè)x。顯然,只要后面這個(gè)數(shù)值(即最多能放置的個(gè)數(shù))如果比前面這個(gè)數(shù)(即必須放置的)要小,不管小多少,就一定會(huì)矛盾。因?yàn)槲覀儫o(wú)法達(dá)成這里給出的要求。
那么用秩的說(shuō)法就是,一個(gè)魚(yú)結(jié)構(gòu)的秩必須大于或等于0才有效,即使無(wú)法刪數(shù),或者其它原因沒(méi)有刪數(shù),但起碼不會(huì)像是秩為負(fù)數(shù)那樣立刻矛盾。
1-4?好了,秩可以怎么用呢?
所以,我們可以基于這一點(diǎn),產(chǎn)生一些有關(guān)秩這個(gè)理論的一些基礎(chǔ)用法。我們把魚(yú)作一個(gè)推廣。之前我們要求的魚(yú)的定義域區(qū)域數(shù)要必須等于刪除域區(qū)域數(shù),是為了保證魚(yú)內(nèi)部的所有刪除域都是有效的。但如果我們沒(méi)有必要?jiǎng)h除那么多,或者目的并非是找這種刪數(shù)多的魚(yú)的時(shí)候,或者甚至是根本找不到刪數(shù)多的魚(yú)結(jié)構(gòu)的時(shí)候,我們可以試試找找,刪除域區(qū)域數(shù)比定義域區(qū)域數(shù)多的魚(yú)結(jié)構(gòu)。
當(dāng)刪除域區(qū)域數(shù)比定義域區(qū)域數(shù)多,那么這個(gè)差值,即魚(yú)的秩一定就會(huì)大于0,雖然我們不能得到結(jié)論,但是起碼它不是負(fù)數(shù),就意味著結(jié)構(gòu)是可能成立的,只是刪數(shù)不知道在哪里罷了。
那么總的來(lái)說(shuō),不飽和魚(yú)結(jié)構(gòu)的使用方式是這樣的。我們?nèi)绻业揭粋€(gè)結(jié)構(gòu),經(jīng)過(guò)全覆蓋要求后發(fā)現(xiàn)刪除域區(qū)域比定義域區(qū)域多,就算找到了不飽和魚(yú)結(jié)構(gòu)。此時(shí)只要我們找到某一處位置,假設(shè)它填入后,能使得魚(yú)的剩余結(jié)構(gòu)的秩變?yōu)樨?fù)數(shù)時(shí),我們就可以認(rèn)為結(jié)構(gòu)產(chǎn)生矛盾了,故原假設(shè)錯(cuò)誤,刪掉它。
實(shí)際上,在有時(shí)候不一定能立刻找到秩為負(fù)數(shù)的矛盾,因?yàn)橛行r(shí)候結(jié)構(gòu)秩看起來(lái)為0,實(shí)際上并不是真正的0。這些結(jié)構(gòu)都非常麻煩,而且大多數(shù)例子直接使用秩來(lái)理解都不是很方便,反而還不如通過(guò)代入試填來(lái)推導(dǎo)矛盾來(lái)得快。所以在有些時(shí)候,試填和利用同數(shù)技巧來(lái)獲得結(jié)構(gòu)內(nèi)部的矛盾的過(guò)程,稱為飽和性測(cè)試(Saturation Test)。雖說(shuō)試填有一些暴力,但依舊通過(guò)邏輯層面推導(dǎo),所以在邏輯層面,我們是可以接受的。下面我們將拿出眾多的示例給大家分析。
那么我們嘗試使用這個(gè)方式來(lái)理解一些常見(jiàn)的不飽和魚(yú)結(jié)構(gòu)吧。
Part 2?不飽和魚(yú)的示例
2-1?不飽和四鏈列

如圖所示,我們嘗試找到c1389的所有數(shù)字6,并尋找新的區(qū)域來(lái)執(zhí)行全覆蓋要求。可以發(fā)現(xiàn),此時(shí)我們找到了r13589b4一共6個(gè)區(qū)域,才覆蓋完所有的數(shù)字。一般來(lái)說(shuō),我們都會(huì)去刪除域上找刪數(shù),所以此時(shí)我們對(duì)于每一個(gè)刪除域上的含有候選數(shù)6的單元格執(zhí)行假設(shè)操作。
此時(shí)發(fā)現(xiàn),假設(shè)r5c2 = 6的時(shí)候,我們將有下圖這樣的構(gòu)型。

如圖所示,這樣的構(gòu)型好像看似沒(méi)有什么問(wèn)題,因?yàn)槎x域區(qū)域依舊是4個(gè),而刪除域區(qū)域則變?yōu)榱?個(gè)。雖然變少了,但是刪除域區(qū)域數(shù)依舊和定義域區(qū)域數(shù)一樣多,起碼它并非變?yōu)橹刃∮?的情況,即定義域區(qū)域比刪除域區(qū)域數(shù)量還多的情況。不過(guò)請(qǐng)你注意一個(gè)地方。由于我們假設(shè)到r5c2 = 6的時(shí)候,結(jié)構(gòu)剩下的部分變?yōu)榱艘粋€(gè)看起來(lái)很像是四鏈列的構(gòu)型??雌饋?lái)雖然沒(méi)有什么異樣,但請(qǐng)你仔細(xì)思考一下,這個(gè)結(jié)構(gòu)真的存在嗎?我們可以發(fā)現(xiàn)到的是,不論你怎么放置這些填數(shù),任取其中三處填入,最終都必然會(huì)有一個(gè)定義域區(qū)域無(wú)法填數(shù),這便產(chǎn)生了矛盾。可你會(huì)問(wèn),這是為什么呢?


我們嘗試盡量使用簡(jiǎn)單的思路來(lái)解釋。我們可以通過(guò)結(jié)構(gòu)找到兩條摩天樓結(jié)構(gòu),且它們共用一個(gè)定義域區(qū)域作為強(qiáng)關(guān)系產(chǎn)生的區(qū)域。之所以這么做,是為了后面證明出現(xiàn)矛盾作出鋪墊。
我們可以觀察圖上的兩種填數(shù)模式,就可以發(fā)現(xiàn),此時(shí)已經(jīng)產(chǎn)生了不對(duì)勁。左圖的刪數(shù)和右圖的刪數(shù)能夠?qū)?yīng)到c9的唯一的兩處填數(shù)位置,而這兩處位置都被刪除了。這便使得c9就不能填數(shù)了。因?yàn)殒準(zhǔn)峭瑫r(shí)可以成立的,所以刪數(shù)也都是同時(shí)成立的。而刪數(shù)導(dǎo)致了c9無(wú)法填入6,所以出錯(cuò)。
那么既然錯(cuò)誤了,這便就說(shuō)明了這樣的結(jié)構(gòu)不存在,就得到了原本的假設(shè)(r5c2 = 6的說(shuō)法)自然就是錯(cuò)誤的了,所以r5c2 <> 6。
可是你會(huì)思考,這也只能說(shuō)明這一個(gè)例子才能滿足這個(gè)要求,而其它的例子不一定。實(shí)際上,其它的例子也都符合這種要求,只要我們能形成上述形狀的構(gòu)型的話。由于結(jié)構(gòu)的特殊性,結(jié)構(gòu)只會(huì)涉及8個(gè)單元格,而且8個(gè)單元格分屬于四行四列,且兩個(gè)一組,出現(xiàn)在同一個(gè)并排三宮里。這句話有點(diǎn)繞,具體的意思指的是,比如c13這兩處定義域區(qū)域,它們都處于b147這樣并排的三個(gè)宮里;同理,c89也是一樣。這樣一來(lái),我們還有c1389都是共軛對(duì)這一個(gè)條件,這就使得結(jié)構(gòu)產(chǎn)生了非常多的摩天樓,并且能互相刪除自己的某一個(gè)端點(diǎn)。當(dāng)我們給出的鏈合適時(shí),刪除的位置就應(yīng)當(dāng)會(huì)排除掉同一個(gè)定義域區(qū)域下的所有情況,使得結(jié)構(gòu)出錯(cuò)。
可能你還是有問(wèn)題的地方在于,定義域區(qū)域數(shù)和刪除域區(qū)域數(shù)此時(shí)是一致的,那么秩為0,根據(jù)理論,秩為0的結(jié)構(gòu)是可以直接把刪除域區(qū)域的所有位置都看作刪數(shù)的地方來(lái)刪數(shù)的,可這個(gè)例子怎么就不行了呢。實(shí)際上,我們?cè)谡撟C摩天樓存在和刪數(shù)的時(shí)候,用到了過(guò)多的定義域區(qū)域來(lái)論證:首先,我們用到了四個(gè)定義域區(qū)域,是結(jié)構(gòu)本身存在的;而b13是隱藏的,因?yàn)閎13在6排除了r1389c2(6)的刪數(shù)。所以,定義域區(qū)域比刪除域區(qū)域數(shù)還多2個(gè),所以秩為-2,導(dǎo)致矛盾的出現(xiàn),而b13實(shí)際上我們?cè)诮Y(jié)構(gòu)論證矛盾(就是剛才摩天樓技巧的互相刪數(shù)那里)是用到了它的,要不你自己獨(dú)立想一想?
接下來(lái)我們?cè)賮?lái)看一則不飽和四鏈列的示例。

如圖所示,這個(gè)結(jié)構(gòu)看起來(lái)比較簡(jiǎn)單,但刪數(shù)很“離奇”:不飽和魚(yú)按道理是通過(guò)假設(shè)得到的刪數(shù)結(jié)論,而這個(gè)例子卻巧合地刪除了四個(gè)數(shù)字之多。下面我們就來(lái)挨個(gè)進(jìn)行分析和討論。
假如r6c2 = 7,則c2和b4兩個(gè)刪除域區(qū)域就會(huì)由于填數(shù)假設(shè)而直接被去掉,但這個(gè)假設(shè)并不會(huì)影響到任何定義域區(qū)域(當(dāng)然,b7此時(shí)可以出數(shù),但是我們考慮通過(guò)秩的邏輯來(lái)說(shuō)明,所以這里我們不繼續(xù)往下假設(shè))。
顯然,定義域區(qū)域數(shù)依舊是4個(gè),但刪除域區(qū)域數(shù)變?yōu)榱?個(gè)(原本有5個(gè),但c2和b4消失,所以只剩下3個(gè))。但是,此時(shí)刪除域區(qū)域數(shù)比定義域區(qū)域數(shù)還少,秩為-1。我們說(shuō)過(guò),秩為負(fù)的時(shí)候,結(jié)構(gòu)出錯(cuò),所以這個(gè)結(jié)構(gòu)便產(chǎn)生了矛盾。故r6c2 <> 7。
而其余三個(gè)刪數(shù),是通過(guò)普通魚(yú)的視角得到的,這一點(diǎn)其實(shí)在之前的例子里已經(jīng)說(shuō)明了它們的刪數(shù)緣由。

如圖所示。如果我們把定義域區(qū)域b6的視角改變到r4的話,定義域就和不飽和魚(yú)所給的定義域完全一樣了。
當(dāng)然了,至于為什么可以這么切換視角,你可以嘗試自己論證這一點(diǎn),你可以通過(guò)秩在切換視角后依舊不產(chǎn)生變化這一點(diǎn)來(lái)論證它。

我們?cè)賮?lái)看一則示例,這一則示例則更像是第一例里那樣的刪數(shù)邏輯樣式。
如圖所示,細(xì)數(shù)定義域區(qū)域和刪除域區(qū)域,定義域區(qū)域一共4個(gè),分別是b2356;而刪除域區(qū)域則是r23456,一共5個(gè)區(qū)域。如果r5c23(3)其中有一個(gè)為真,都會(huì)使得結(jié)構(gòu)只剩下{r2c57, r3c69, r4c59, r6c67}(3),不論如何填入3,都會(huì)出現(xiàn)錯(cuò)誤。因?yàn)樵緍789c5679都是不含有候選數(shù)3的,這使得3只能放在上面的單元格里;而由于r5c23(3)其一成立的關(guān)系,使得3的位置變?yōu)轭愃朴谥暗谝粍t示例的樣子,導(dǎo)致無(wú)法填數(shù)。當(dāng)然,通過(guò)秩來(lái)解釋就是,結(jié)構(gòu)涉及的定義域和刪除域個(gè)數(shù)發(fā)生了變化,導(dǎo)致差值為負(fù)數(shù),出現(xiàn)了矛盾。
當(dāng)然,這個(gè)題更為簡(jiǎn)單的理解方式就是轉(zhuǎn)化為之前看到過(guò)的一定矛盾的構(gòu)型:我們嘗試把b2356的定義域改變?yōu)閏5679,就會(huì)發(fā)現(xiàn),實(shí)際上結(jié)構(gòu)就變?yōu)榱酥澳菢拥拿艿臉?gòu)型,你可以自己試試看。
2-2?不飽和五鏈列


如左圖所示,我們需要找到r345689b1一共7個(gè)刪除域區(qū)域才能實(shí)現(xiàn)全覆蓋。所以此時(shí)的魚(yú)的秩為7 - 5 = 2。假設(shè)r3c1 = 8,則結(jié)構(gòu)將會(huì)消失兩個(gè)刪除域區(qū)域b1和r3,而定義域區(qū)域不會(huì)消失。
似乎看起來(lái)秩變?yōu)?了。實(shí)則不然。它同時(shí)還影響著b47兩個(gè)宮,使得在b47里填入8的位置分別只能在{r4c3, r56c2}和{r8c3, r9c2}里。那么,這樣一來(lái),仔細(xì)觀察c45填入8的地方,就可以發(fā)現(xiàn),不論b6里填入8的位置在哪里,左側(cè)c23和c45填8的位置都能形成和之前示例完全一樣的構(gòu)型,而這種構(gòu)型在之前都已經(jīng)講得比較清楚了,所以這種結(jié)構(gòu)不用再去推導(dǎo),就知道它一定是錯(cuò)誤的。所以,原假設(shè)錯(cuò)誤。
我們?cè)賮?lái)看一些這樣的示例。

如圖所示,這個(gè)結(jié)構(gòu)看起來(lái)好像秩為0,對(duì)吧。實(shí)際上你可以看到,如果照著結(jié)構(gòu)給出的樣子的話,r1c4(6)和r9c6(6)是無(wú)法覆蓋到的。所以,這個(gè)結(jié)構(gòu)的刪除域?qū)嶋H上是r34678b28,一共7個(gè)刪除域區(qū)域。
我們嘗試對(duì)兩個(gè)刪數(shù)逐個(gè)進(jìn)行討論。假設(shè)r7c8(6)為真,則會(huì)如何呢?

我們畫(huà)出這樣的一個(gè)推導(dǎo)過(guò)程。注意著不是鏈,所以沒(méi)有用實(shí)線虛線表達(dá)強(qiáng)弱關(guān)系。顯然,這樣畫(huà)出來(lái)后,打勾的就是我們假設(shè)填入的地方,打叉的則是不能填入的地方。那么我們?cè)俅吾槍?duì)剩余的部分執(zhí)行推導(dǎo)。
結(jié)構(gòu)因?yàn)樘钊肓藃6c9(6),所以少了一個(gè)定義域區(qū)域,而刪除域區(qū)域少了幾個(gè)呢?r6是肯定會(huì)消失的,而原假設(shè)r7c8(6)使得r7刪除域區(qū)域消失,所以少了兩個(gè)。現(xiàn)在依然沒(méi)有矛盾,我們還得繼續(xù)去發(fā)現(xiàn)。


接著我們觀察左圖,圖中有一個(gè)在c34上的摩天樓,于是得到r3c56 <> 6的結(jié)果,此時(shí)觀察c5,發(fā)現(xiàn)6有出數(shù),于是變?yōu)橛覉D的狀況。此時(shí)就可以發(fā)現(xiàn),c6無(wú)法填入數(shù)字6,出現(xiàn)錯(cuò)誤。所以,原本的假設(shè)r7c8(6)是錯(cuò)誤的,應(yīng)當(dāng)刪除掉。
別急,這個(gè)示例還有一個(gè)r8c1(6)的刪數(shù)我們還沒(méi)有說(shuō)明。

如圖所示,似乎設(shè)定r8c1(6)為真,更難分析得到結(jié)論。是的,確實(shí)它比較復(fù)雜,因?yàn)槲覀兗僭O(shè)到的第一步就遇到了瓶頸:我們好像無(wú)法繼續(xù)推導(dǎo)了,因?yàn)闆](méi)有一處可以出數(shù)。不過(guò)我們不能灰心,實(shí)際上是有辦法解決掉這個(gè)瓶頸的。


先看左圖,可以看到,結(jié)構(gòu)里有一個(gè)同數(shù)環(huán)結(jié)構(gòu)。而刪數(shù)是通過(guò)環(huán)結(jié)構(gòu)的定義得到的,即弱關(guān)系對(duì)應(yīng)的區(qū)域,所以結(jié)構(gòu)里可以刪除的地方是r3c6(6)和r7c4(6)。在刪除了它們后,我們?cè)賮?lái)看右圖。右圖里由于刪除了剛才給出的兩處地方,所以剩余的部分里可以找到兩個(gè)摩天樓,得到刪數(shù)r3c5(6)和r7c5(6)。
此時(shí)就可以發(fā)現(xiàn)問(wèn)題了:定義域區(qū)域c5里無(wú)法找到合適的地方填6了,所以出現(xiàn)了矛盾,所以原假設(shè)r8c1(6)錯(cuò)誤,應(yīng)當(dāng)刪除掉。
看了這么多例子了,我相信你應(yīng)該有所感受。我們尋找刪數(shù)矛盾,總是通過(guò)試填的方式來(lái)證明矛盾的出現(xiàn),矛盾的出現(xiàn)也都只是利用結(jié)構(gòu)內(nèi)部(即定義域里)的所有候選數(shù)而已,并未涉及外部的任何其它的候選數(shù)。這也算作一種約定俗成的方式。
實(shí)際上,我們完全可以利用外部的數(shù)字來(lái)推導(dǎo)矛盾,但涉及的東西就比較多了,而且顯得比較暴力。就好比UR里,我們通過(guò)強(qiáng)制UR的思路可以得到,實(shí)際上它也僅僅是利用了UR結(jié)構(gòu)內(nèi)部的候選數(shù)和共軛對(duì)來(lái)推導(dǎo)矛盾的,并沒(méi)有涉及外部的其它任何數(shù)字。
我們?cè)賮?lái)看一則相對(duì)熟悉的例子。

如圖所示。我們假設(shè)r3c2(5)或r6c3(5)其一成立的話,它們的位置看起來(lái)似乎是影響差不多的。比如r3c2(5)如果為真,則顯然會(huì)使得r12c3(5)和r45c2(5)同假,而r6c3(5)也會(huì)導(dǎo)致一樣的情況出現(xiàn)。所以我們可以斷言,如果r3c2(5)可以刪除,那么r6c3(5)也可以刪除,我們就不必兩個(gè)候選數(shù)都推理一遍了。
我們假設(shè)r3c2(5)為真,則可以得到下面圖中給出的樣子。

看起來(lái)定義域區(qū)域是5個(gè),刪除域區(qū)域也是5個(gè),但結(jié)構(gòu)出錯(cuò)了嗎?確實(shí)是出錯(cuò)了。我們嘗試觀察b9,任意一處填數(shù)都會(huì)使得上方給出的r1245四行定義域區(qū)域出現(xiàn)類似于之前遇到過(guò)很多次的出錯(cuò)構(gòu)型。所以,整體這個(gè)結(jié)構(gòu)必然是錯(cuò)誤的。這便得到了最開(kāi)始假設(shè)的矛盾,故r3c2(5)是可以刪除的;當(dāng)然,r6c3(5)也是一樣的。
和上面差不多的出錯(cuò)方式的示例還有下面這一個(gè)。


如左圖所示,如果我們嘗試假設(shè)r3c3(4)為真,則由于r4共軛對(duì)的關(guān)系,直接可以得到r5c4(4)為真,于是依然出現(xiàn)了如右圖所示的出錯(cuò)構(gòu)型。
所以,這些例子都還是比較清晰和神奇的。我們?cè)賮?lái)看一則利用魚(yú)鰭推導(dǎo)的。

如圖所示,這個(gè)結(jié)構(gòu)飽和五個(gè)定義域區(qū)域和五個(gè)刪除域區(qū)域,不過(guò)含有四個(gè)魚(yú)鰭,而且四個(gè)魚(yú)鰭不都能直接得到刪數(shù)的成立。不過(guò)我們依然可以嘗試?yán)迷囂畹姆绞絹?lái)得到矛盾。首先,兩個(gè)外魚(yú)鰭是可以直接對(duì)應(yīng)刪數(shù)的,所以我們就不再討論它們了。接著我們來(lái)討論兩個(gè)內(nèi)魚(yú)鰭的情況。


如左圖所示,假設(shè)r5c5(7)成立,則我們可以依次得到r4c7(7)和r8c1(7)為真的結(jié)果,由于r8c1(7)的成立,所以此時(shí)是可以刪除r6c1(7)的。
如右圖所示,假設(shè)r8c5(7)成立,則排除掉一些情況,我們發(fā)現(xiàn)剩余部分里,r59形成了一個(gè)二鏈列結(jié)構(gòu),而這個(gè)二鏈列依舊可以刪除r6c1(7)。
所以實(shí)際上,兩個(gè)內(nèi)魚(yú)鰭依舊可以對(duì)應(yīng)到刪數(shù),所以刪數(shù)r6c1(7)不論哪個(gè)魚(yú)鰭成立都可以刪除掉;而且魚(yú)結(jié)構(gòu)的刪除域也包含r6c1(7),所以它可以安全地被刪除。
這一則示例之所以放在不飽和魚(yú)里講解,是因?yàn)檫@一則示例也是通過(guò)不飽和魚(yú)的結(jié)構(gòu)包裝得到的構(gòu)型。如果你在做題過(guò)程之中能發(fā)現(xiàn)這樣的形式的結(jié)構(gòu),我們就可以通過(guò)利用魚(yú)鰭的方式來(lái)討論,把結(jié)構(gòu)變?yōu)橹葹?的飽和魚(yú)結(jié)構(gòu),這樣看起來(lái)邏輯比起之前的示例要清晰一些。

如圖所示,這是一個(gè)交叉五鏈列,看起來(lái)還不錯(cuò),不過(guò)多了兩個(gè)內(nèi)魚(yú)鰭。我們嘗試逐個(gè)進(jìn)行討論。


如圖所示,這是兩個(gè)討論情況。可以看到的是,不論哪種情況成立,刪數(shù)都是可以刪掉的,因?yàn)樽罱K我們都會(huì)在b46里發(fā)現(xiàn)一組級(jí)聯(lián)區(qū)塊結(jié)構(gòu)。級(jí)聯(lián)區(qū)塊可以當(dāng)作X-Wing使用,而它們都會(huì)刪除r4這一個(gè)區(qū)域的6。


如左圖所示,我們找到一個(gè)交叉五鏈列結(jié)構(gòu),不過(guò)刪除域區(qū)域比較多,要想覆蓋完整就需要r1678b2368一共8個(gè)區(qū)域才行。不過(guò)不要緊,刪除域區(qū)域再多也不害怕,因?yàn)閯h數(shù)一定是在刪除域區(qū)域上的。那么假設(shè)我們讓r6c9(5)為真,會(huì)如何呢?
如右圖所示,我們按照順序推導(dǎo),就會(huì)發(fā)現(xiàn),b3里同時(shí)出現(xiàn)兩處填入5的地方,這便是產(chǎn)生了矛盾。所以原來(lái)的假設(shè)是錯(cuò)誤的。
那么,我們給出了這么多例子,下面再給出兩則示例,希望你能夠自己理解它們。

這一則示例看起來(lái)比較麻煩,但實(shí)際上并不難。

這一則也是一樣。
2-3?不飽和六鏈列
接下來(lái)我們來(lái)看一些不飽和六鏈列的示例。


如左圖所示,這個(gè)示例看起來(lái)很漂亮,因?yàn)榻Y(jié)構(gòu)高度對(duì)稱。假設(shè)r6c5(9)為真,則變?yōu)橛覉D這樣。
右圖看起來(lái)似乎很麻煩,但實(shí)際上,它可以轉(zhuǎn)化為之前我們就講到過(guò)很多次的矛盾的構(gòu)型。我們隨意拿出一處定義域區(qū)域的兩個(gè)情況來(lái)進(jìn)行討論,就可以發(fā)現(xiàn)討論后一定會(huì)出現(xiàn)矛盾,這里我們就不重復(fù)給出示例的推導(dǎo)過(guò)程了,你可以自己試試看。

如圖所示,假設(shè)r5c2(2)為真,則會(huì)產(chǎn)生矛盾。這一則示例就自己理解了,我們不再重復(fù)敘述它的具體邏輯。
Part 3?最后的介紹
魚(yú)的內(nèi)容就全部說(shuō)完了,最后我們需要介紹一些理論的內(nèi)容,以便編寫(xiě)電腦程序,或者書(shū)寫(xiě)參考文檔時(shí)使用。
3-1?為什么同數(shù)技巧全都可以叫做魚(yú)?
這一點(diǎn)我們其實(shí)看過(guò)眾多例子了,所以我們不必過(guò)多敘述就能明白這一點(diǎn)。二階的魚(yú)結(jié)構(gòu)我們可以轉(zhuǎn)化變?yōu)殒溄Y(jié)構(gòu),例如雙強(qiáng)鏈,或者帶有區(qū)塊的雙強(qiáng)鏈結(jié)構(gòu);而三階的甚至更高階的,我們都可以通過(guò)魚(yú)鰭的包裝來(lái)得到推導(dǎo);而包裝比較麻煩的,可以通過(guò)遠(yuǎn)程試填來(lái)得到矛盾,或者甚至不用包裝魚(yú)鰭,直接上手就開(kāi)始找內(nèi)部的矛盾。所以,所有同數(shù)技巧其實(shí)都可以包裝形成魚(yú)結(jié)構(gòu)。
3-2 自噬為什么是魚(yú)的內(nèi)容,而不是其它技巧的內(nèi)容?
這一點(diǎn)我們也不必去過(guò)多敘述了。自噬就是通過(guò)刪除域區(qū)域的交集而產(chǎn)生的一種特殊刪數(shù)。如果它還在定義域區(qū)域上,那么刪除它的原因就是因?yàn)樵窘Y(jié)構(gòu)的秩為0,而因?yàn)樘钊牒?,定義域區(qū)域少一個(gè),而刪除域區(qū)域少兩個(gè),秩變?yōu)?1,出現(xiàn)了矛盾。
不過(guò)可以通過(guò)魚(yú)結(jié)構(gòu)的理論知道,當(dāng)魚(yú)結(jié)構(gòu)本身的秩就已經(jīng)不是0的時(shí)候,我們并不難妄自下結(jié)論,說(shuō)某個(gè)處于刪除域交集上的候選數(shù)依舊是自噬刪數(shù)。這樣是不對(duì)的,因?yàn)樗词固钊耄~(yú)結(jié)構(gòu)的秩也不能保證變?yōu)槎嗌?;更何況有一大部分魚(yú)結(jié)構(gòu)的秩并不是結(jié)構(gòu)得到0就必然能夠得到刪除域區(qū)域全刪的結(jié)論的。
3-3 魚(yú)的系統(tǒng)命名規(guī)則
我們先來(lái)說(shuō)說(shuō)飽和魚(yú)結(jié)構(gòu)(即定義域區(qū)域和刪除域區(qū)域數(shù)相同,且全覆蓋的情況)的命名規(guī)則。
我們有如下的順序來(lái)修飾一個(gè)魚(yú):
解釋如下:
鰭化修飾符:表示鰭影響到結(jié)構(gòu)的類型。有三種鰭化類型:標(biāo)準(zhǔn)(Basic)、退化(Sashimi)和孿生(Siamese)。當(dāng)為“標(biāo)準(zhǔn)”時(shí),應(yīng)當(dāng)省略不寫(xiě)。且“退化”一詞的位置應(yīng)調(diào)整至鰭名修飾符之后。
鰭數(shù)量修飾符:表示有多少個(gè)鰭。如果有多種鰭,則按照外鰭、內(nèi)鰭、自噬鰭的順序排列。如果同一種鰭只有一個(gè)或兩個(gè)的,則使用單(Single)和雙(Double)修飾,超過(guò)兩個(gè)的,則使用漢字?jǐn)?shù)字三(Triple)、四(Quadruple)、五(Quintuple)等表示。
鰭名修飾符:表示鰭的名字。有兩種鰭:外鰭(Exo-fin)、內(nèi)鰭(Endo-fin)。拼寫(xiě)時(shí)應(yīng)按照此順序排列,并配合鰭數(shù)量修飾符描述。
形狀修飾符:表示形狀。一共有三種形狀:標(biāo)準(zhǔn)(Basic)、宮內(nèi)(Franken)、交叉(Mutant);標(biāo)準(zhǔn)鏈列(標(biāo)準(zhǔn)魚(yú))的“標(biāo)準(zhǔn)”一詞一般可以省略。
規(guī)格修飾符:表示規(guī)格。規(guī)格取自于結(jié)構(gòu)的定義域區(qū)域數(shù)。一般一共有六種規(guī)格(范圍在 2 到 7 之間),使用漢字?jǐn)?shù)字后添加“鏈列”二字即可。超過(guò)其規(guī)格的,仍使用數(shù)字,但結(jié)構(gòu)本身一般不符合其標(biāo)準(zhǔn);英文里一般有六種規(guī)格(范圍在2到7之間):X-Wing、Swordfish、Jellyfish、Squirmbag(或Starfish)、Whale、Leviathan。超過(guò)其規(guī)格的,使用“數(shù)字 + 連字符 + Fish”的寫(xiě)法,如8-Fish,但結(jié)構(gòu)本身一般不符合其標(biāo)準(zhǔn)。
合格的命名可以是如下的示例:
雙外鰭單內(nèi)鰭退化宮內(nèi)五鏈列
四外鰭三鏈列
當(dāng)然,你也可以使用D\S描述(D\S Description)來(lái)描述魚(yú)結(jié)構(gòu)。如:
rrb\ccc魚(yú)(三階、宮內(nèi))
ccbb\rrrc魚(yú)(四階、交叉)
其中用r表示一個(gè)行區(qū)域,c表示一個(gè)列區(qū)域,b表示一個(gè)宮區(qū)域。反斜杠左側(cè)的部分是魚(yú)的定義域涉及的區(qū)域的類型集合,右邊則是刪除域區(qū)域涉及的區(qū)域集合。
當(dāng)然,也可以直接將定義域區(qū)域和刪除域區(qū)域、結(jié)構(gòu)涉及的數(shù)字、甚至是魚(yú)鰭體現(xiàn)在其中。涉及的數(shù)字應(yīng)寫(xiě)在D\S描述的前面,而魚(yú)鰭應(yīng)寫(xiě)在D\S描述之后,用空格隔開(kāi),且使用字母f、ef前綴表示屬于外鰭還是內(nèi)鰭,并且以“外鰭、內(nèi)鰭”的順序排放。如:
2 r19b26\c578b1 fr3c6 fr9c3
1 r9c4b6\r47c8 fr9c3
9 c29b6\r468 efr4c9
這樣可以直接看出規(guī)格、形狀。其中的fr3c6就是指明有一個(gè)外鰭位于r3c6。第一個(gè)示例涉及的候選數(shù)是2,而第二個(gè)示例涉及的則是1。當(dāng)詳細(xì)描述時(shí),末尾的“魚(yú)”字可以被省略。
當(dāng)魚(yú)的定義域區(qū)域數(shù)少于刪除域區(qū)域數(shù)時(shí),稱為不飽和魚(yú)。這個(gè)術(shù)語(yǔ)詞已經(jīng)在之前提到過(guò)了。
當(dāng)不飽和時(shí),刪除域區(qū)域數(shù)大于定義域區(qū)域數(shù),此時(shí)應(yīng)為魚(yú)名稱最前面添加“不飽和”一詞,規(guī)格按照定義域區(qū)域數(shù)計(jì)算。比如定義域區(qū)域有4個(gè),而刪除域區(qū)域有5個(gè),則我們認(rèn)為結(jié)構(gòu)是一個(gè)四鏈列,而不是五鏈列。
3-4 魚(yú)圖的符號(hào)規(guī)則
魚(yú)圖里一般想要表達(dá)出意思,需要不同的符號(hào)標(biāo)識(shí)來(lái)表達(dá)。下面羅列出所有需要用到的符號(hào)。
永假符號(hào)/:放到單元格里,表示該單元格不能放入魚(yú)涉及的這個(gè)數(shù);
魚(yú)結(jié)構(gòu)符號(hào)x:表示當(dāng)前單元格可能填入這個(gè)數(shù)字;
刪數(shù)符號(hào)*:表示當(dāng)前單元格可以通過(guò)結(jié)構(gòu)刪除該單元格的這個(gè)數(shù)字;
外魚(yú)鰭符號(hào)F或&:表示當(dāng)前單元格的這個(gè)數(shù)字是作為外魚(yú)鰭出現(xiàn)的;
內(nèi)魚(yú)鰭符號(hào)E或@:表示當(dāng)前單元格的這個(gè)數(shù)字是作為內(nèi)魚(yú)鰭出現(xiàn)的;
自噬符號(hào)C或*x:表示當(dāng)前單元格的這個(gè)數(shù)字是作為自噬刪數(shù)出現(xiàn)的;
重刪數(shù)符號(hào)**:表示當(dāng)前單元格在一個(gè)飽和魚(yú)結(jié)構(gòu)不論魚(yú)鰭是否成立,都能刪除的地方;
殘缺符號(hào)I或!:表示當(dāng)前單元格是結(jié)構(gòu)不一定必需涉及的地方,它可以不存在,結(jié)構(gòu)照樣成立,且刪數(shù)成立;
未知符號(hào)?:表示當(dāng)前單元格的刪數(shù)是否成立,并不清楚。