午前11時起床,曇り.朝食はネギ入りとんこつラーメン,ほうれん草と青菜のお浸し.結局ステファニーの Connect & Communicate コースを取ることにした.コースは12週で$497のところ,$397.分割すると150ドルx3回になる.通常割賦では200ドルx3なので150ドルの節約だ.ディスカウントの締め切りが迫っていたので急遽決断した.English Full:Time 24/7 のコースは10コースあるが,短いクリップの寄せ集めなので1日1コースは履修可能に思われる.
Connect & Communicate コースの方は週に一度の配信なのでダブルブッキングでもこなせると判断した.と言っても C & C コースにもすでに相当量の既存教材が蓄積されているので,うかうかすると仕事しているヒマがなくなってしまうかもしれない.今日はともかく打ち切って仕事に入ることにしたのだが… ネットで遊んでいるといくら時間があっても足りなくなる.昨日の続きに戻ろう.
現状における問題点はAAが多重になってしまっているという点だ.AA(0)は基準ノードの配偶者だが,このノードは可視で正しい位置に配置されている.AAの仮ノードは現在以下のような状態になっている.
- (0) 基準ノードの配偶者,可視の左手本人
- (1) 可視の本人ノード
- (2) 可視の配偶者ノード
- (3) 配偶者ノード 不可視の右手婚配偶者
問題は(1)の本人ノードと(2)の配偶者ノードだ.(1)は仮ノード消去されなくてはならないので,そうなっていない理由を調べる必要がある. (2)では(3)のケースと同様に(0)とBTWを組まなくてはならないのにそうなっていない理由を調べる必要がある.まず,(1)から見てみよう.おかしい.動作が変わってしまった.どこか壊してしまったのだろうか?見当が付かないので一旦バックアップに戻ろう.いや,バックアップに戻しても同じ障害が起きる.
エラーが起きているのはIsMukoYoshiだが,このエラーはNAMEBOX::UnErasableでcheckをオンにしただけで起きるようになる.どうも検査用コードで実動作が起きているようだ.checkブロックでIsMukoYoshiを実行している.この関数は「家内婚の左手本人であるか否かを判定」するためのものだ.対象ノードは#731AE(1).この関数は拡張枠全体を検査している.結婚枠の中に対象ノードを配偶者とするノードが存在する場合には「家内婚」と認定し,さらに検査を行う.
対象ノードはBTW右手本人属性と左手本人属性を持っている.これに対し例外が起きているノードはBTW右手本人だ.家内婚はBTWとして処理されているはずだから,対象ノードが左手本人,障害ノードが右手本人という関係になっているものと推定される.家内婚左手本人とは結婚枠の中で下流に位置するノードと定義されているはずだが,現行では多分家内婚は左手本人預かりとなっているはずだ.「家内婚は左手本人預かりとする@20190126」というオプションはオンだ.
この関数の論理ではBTW右手本人を家内婚左手本人としているように思われる.これでよいのかどうかは別途調べる必要があるが,今の場合は候補ノードはBTW右手本人なので家内婚左手本人と断定しようとしているようだ.IsValidNameBoxではBTW右手本人をIsValidNameBoxで取り出そうとしているが明らかに誤っている.このノードはBTW右手配偶者なのだから当然不可視で空の状態になっている.⇒IsValidNameBoxに代えてIsNameBoxAppearを使うようにした.これでcheckブロック内の障害は片付いた.
NAMEBOX::CheckUnerasableには「本人カードがこのノードだけで同世代の配偶者ノードが2つ以上ある場合は消去不可 @@2017-02-27」という判定条件が入っている.現行では原理的に配偶者多重を防止するようになっているはずだから,このロジックは不用と思われる.この条件変更は「左手枠配偶者を左手本人とするBTW拡張@20190130」によると考えて間違いないだろうか?多分それでよいはずだ.これで問題の一つは片付いた.
多重も2枚だけになった.これは仮ノード消去の参照先としてAA(2)が選択されているためと考えられる.ここではやはり,基準ノードの配偶者を特殊扱いするための属性を与えておくことにしよう.これは「基準ノードの配偶者」というだけでよいのだろうか?だとすれば属性ではなく特性関数でもよいような気はするのだが… 2月10日のログ「基準ノードの配偶者が枠外に出てしまう問題」で「検査関数」を導入するとしているのがそれに当たる.実装したかどうかやや不明だが,作ってしまった方が早いかもしれない.
IsBaseNodeSpouseとHasBaseNodeSpouseという2つの関数が作られているので使うことにしよう.これらの関数は実装されてはいるが使われていない.HasBaseNodeSpouseは「同名仮ノードのうちに基準ノードの配偶者が含まれているか否かを判定し,基準ノードの直近配偶者を返す」という関数だ.NAMEBOX::IsPossibleRealnodeで使ってみることにしよう.
NAMEBOX::DoublyBlessedOneの中でChangeRealRefferenceを使ってノード対の付け替えを実施している.暫定的に止めることでAA(0)を参照できるようになった.ただし,参照実ノードが2つ発生しているところから見てChangeRealRefferenceには何か不良があるように思われるので一度元に戻して調べて見ることにする.