法律是一個由分散式、權力有限的作者隨時間增量維護的系統,需要穩定的細粒度位址以供外部引用。

此結構橫跨民法、普通法及混合法系。表面形式有所不同 — 法規與法案、條文與節、編纂或未編纂 — 但結構限制是相同的。定義的每個元素都承載著重要性:

軟體程式碼庫也因相同原因演化出相同的結構限制:增量修改、多位作者、穩定的外部引用(API 合約、匯入、URL)。`git blame` 與法規出處追蹤之間的相似性,是源自相同結構壓力下的趨同演化。

法規以樹狀結構組織:部分包含章節,章節包含節,節包含子節。這種層級結構的存在是因為紙張是線性的 — 法規必須以頁面序列的形式印刷,而層級結構提供了可導覽的架構。

這些是圖形關係。它們連接樹的分支、法規之間、司法管轄區之間的節點。樹狀結構無法表示它們 — 它只包含每個條文的內容及其在單一法規層級結構中的位置。

這種結構與語義的分離並非新事物。Akoma Ntoso (ISO 24679) 在 2000 年代初期就將文件結構(樹)與法律分析(引用、中繼資料、生命週期)分開。ELI 和 FRBR 提供了識別框架。LegalRuleML 編碼了規範內容。這裡的貢獻並非觀察到法律具有圖形結構 — 這已經確立 — 而是論證正確地計算文本層作為一個可重現、可檢查的重播過程,是正確計算語義層的先決條件。

法律之所以寫成樹狀結構,是因為紙張的要求。法律之所以以圖形方式運作,是因為條文透過忽略層級界線的引用、覆蓋和依賴關係進行互動。法律狀態編譯器對樹狀結構(文本)進行操作,以產生語義工具操作的基礎。

修正案法案並不會說「這是第 12 節的新文本。」它會說「第 12 節,第 2 款修正如下。」這是一個帶有以下內容的類型化操作:

文本層操作的詞彙量很小:

此詞彙量已在芬蘭、英國、愛沙尼亞和歐盟的修正系統中得到驗證。表面語言有所不同(「muutetaan」、「muudetakse」、「is amended to read」),但對文本的結構化操作是相同的。

文本層操作詞彙捕捉序列化文本如何變化。它不捕捉法律意義如何變化。幾類法律行動作用於意義而非文本:

詮釋性疊加。「第 5 節應被理解為『委員會』意指『理事會』。」第 5 節的文本未變。其意義改變了。這是一個語義操作,而非文本操作。普通法中的「推定條款」和「縮減解釋條款」就是這樣運作的。

授權立法。一項法案授權部長制定規章。這產生了產生新法律的權力 — 一個生成未來操作的元操作,而不是對現有文本的操作。

條件適用。「本節僅適用於營業額超過 1000 萬歐元的實體。」文本無條件存在;其法律效力是有條件的。條件是中繼資料,而非文本操作。

恢復。如果廢止條款本身被廢止,原條文是否恢復?答案取決於司法管轄區(在某些普通法系中為否,在其他法系中為是)。墓碑模型(廢止 = 內容為空的版本)並不固有地解決這個問題 — 它需要在虛擬機層面做出政策決定。

不可變基礎傳統。在基礎文本神聖或憲法確立的系統中(伊斯蘭教法、需要超級多數要求的憲法條文),操作不是「替換」— 而是「在不可變的基礎上疊加詮釋」。基礎文本無法修補;只能被包裹。

這些都是真實現象。聲稱能捕捉「法律內容」的編譯器,必須對它們進行建模,或明確將自身範圍限定在文本層。LawVM 採取後者方法:它編譯文本狀態 — 在特定時間點,每個條文的字面內容 — 並將規範狀態(法律的意義、如何適用、產生哪些義務)留給下游語義工具。這是一種刻意關注點分離:先正確處理文本,然後在正確的文本基礎上建立詮釋。另一種方法 — 在未經驗證的文本上建立語義模型 — 導致了數十年的法律本體論工作,卻沒有可靠的文本層支撐。

2024 年 12 月發布的修正案可能於 2026 年 1 月 1 日生效。在這 13 個月期間,修正案存在 — 已頒布、已發布、具有法律效力 — 但為法律目的,它修改的條文尚未改變。

法律至少有兩個時間維度:

這些軸是獨立的。「議會已決定什麼?」和「法律是什麼?」在間隔期間會給出不同的答案。

還存在第三個操作軸:語料庫觀察時間 — 編譯器攝取數據的時間。如果 Finlex 發布了更正,前後的語料庫會有所不同。可重現性需要記錄使用了哪個來源版本。

版本控制系統如 git 只有一個時間維度(提交歷史)。法律至少需要兩個實質維度加上條件維度(領土、部門、偶發情況)。「T 時點的法律是什麼?」是一個多維查詢,而非線性檢索。

樹狀結構暗示條文(節、條)是原子 — 最小的單位。實際上,原子是修正系統所處理的任何粒度。

大多數修正案針對結構節點:替換此節、廢止此款。這些是樹狀操作。

但文本層面的修正會深入到任何結構節點之下:「在第 12 節第 2 款中,詞語『國務卿』被詞語『部長』取代。」這針對的是葉節點內的子字串。該句子不是樹中的節點。修正案的操作粒度比樹的分辨率更細。

請注意,即使是像「國務卿」替換為「部長」這樣「簡單」的詞語替換,也會轉移法定權力 — 它不僅僅是字串編輯,而是法律權力的重新分配。編譯器操作文本;下游規範分析操作意義。兩個層面都很重要。編譯器提供正確的文本,以便規範分析能夠準確。

任何需要在分散式權威下,對層級維護結構進行穩定尋址的系統,都會匯聚到相同的模式:基於路徑的識別符。

這些都是相同的抽象:一組(類型,標籤)對,指定了通過層級結構的遍歷。

這種匯聚是由結構限制強加的:當多個代理獨立修改層級結構的部分,而外部系統通過位址引用特定部分時,位址必須編碼通過層級結構的路徑。

基於路徑的位址有一個眾所周知的弱點:它們是位置性的。在第 11 節和第 12 節之間插入第 11a 節不會破壞第 12 節的路徑,但重新編號(第 12 節變為第 13 節)則會。這就是為什麼重新編號是詞彙表中一個顯式操作的原因 — 它記錄了位址更改,以便更新外部引用。FRBR 和 ELI 通過抽象層級處理此問題(作品級別的身份在表達級別的重新編號後仍然存在)。LawVM 的 ProvisionTimeline 通過重新編號事件保留身份 — 相同的時間線,新的位址。

Ted Nelson 在 1960 年代就預見了這一點。他的 tumblers 可以尋址任何粒度的任何內容,而轉錄意味著引用是實時連結。法律交叉引用(「如第 4 節所定義」)正是 Nelson 的轉錄 — 沒有實時更新機制。當第 4 節被修正時,每個引用它的條文的意義都會靜默改變。法律系統擁有未版本化、無類型、靜默失效的轉錄。

不同的司法管轄區賦予合併文本不同的法律權威,這改變了編譯器的作用:

芬蘭:Finlex 合併文本是「資訊性」的 — 不具法律約束力。「真正」的法律是原始法規加上所有修正案。如果 Finlex 的合併文本有錯誤,那是編輯錯誤。沒有人對法律的計算狀態負法律責任。編譯器作為獨立的預言者 — 重播修正案以發現編輯合併中的錯誤。

愛沙尼亞:Riigi Teataja 合併文本是權威性法律。如果修正案與合併文本之間存在差異,則以合併文本為準。編譯器作為約束性法律的一致性驗證器 — 分歧是具有法律意義的發現,而非編輯腳註。

英國:legislation.gov.uk 發布帶有生效中繼資料的版本化文本。編譯器作為官方版本圖的獨立驗證器。

結構化操作是相同的。尋找差異的社會功能不同:編輯錯誤(芬蘭)、法律不一致(愛沙尼亞)、版本圖錯誤(英國)。

問題定義明確:解析修正案,提取操作,根據先前狀態編譯,生成具有完整出處和時間版本化的合併文本。這是一個編譯器問題。

每個都解決了一部分。開放研究工具中仍未充分發展的是端到端的重播編譯器:輸入修正案文本,輸出類型化操作和時間線,並將殘留物分類而不是隱藏。商業系統(Xcential、Propylon)在生產環境中處理了部分問題;官方系統(legislation.gov.uk)維護版本化的編輯工作流程。但開放的、跨司法管轄區的、可證明重播的方法仍未被充分探索。這種差距的存在是因為問題跨越了計算機科學(編譯器、VCS、圖論)、法律信息學(修正語義學、時間邏輯)、公共行政(權威、出版)和語言學(解析修正語言)。每個學科都看到了其部分。該工具需要所有四個領域。

LawVM 的設計方式與法律的設計方式相同:

最終狀態是法律的語義版本控制系統:一個圖,其中節點是條文版本,邊是立法操作,而時間點的具體化、跨日期差異、條文譜系和跨司法管轄區依賴性跟踪是圖上的查詢。

不是法律本體論或規範推理系統的替代品。它們所需的基礎。一個正確、經過驗證、時間版本化的文本層,語義工具可以在其上構建,而無需自己先解決編譯問題。

構建它是因為法律的結構限制要求如此,而可靠地做到這一點的開放工具尚不存在。

本文解釋了 LawVM 的結構限制,LawVM 是一個開源的、針對修正驅動法律的重播編譯器。請參閱芬蘭案例展示以獲取實證證據,或參閱儲存庫。