那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從數(shù)學(xué)角度思考程序與驗(yàn)證正確性

jf_wN0SrCdH ? 來(lái)源:Rust語(yǔ)言中文社區(qū) ? 2023-03-07 09:40 ? 次閱讀

本文旨在為沒(méi)有接觸過(guò)形式化方法的讀者提供一種新的視角看待計(jì)算機(jī)系統(tǒng)與算法,而非形式化方法或 TLA+ 教程因此本文的重點(diǎn)是如何從數(shù)學(xué)角度思考程序,不會(huì)使用大篇幅講解 TLA+ 的語(yǔ)法。

1

我們?cè)撊绾螌?xiě)出正確的程序?

程序設(shè)計(jì)的目標(biāo)永遠(yuǎn)是寫(xiě)出正確的程序。隨著時(shí)間的推移,我們的程序越來(lái)越復(fù)雜,其中可能存在的錯(cuò)誤也越來(lái)越多。想要寫(xiě)出正確的程序,首先應(yīng)該了解程序中可能出現(xiàn)的錯(cuò)誤有哪些。

程序中會(huì)有什么樣錯(cuò)誤?

我將程序中可能出現(xiàn)的錯(cuò)誤粗略地分為兩類(lèi):簡(jiǎn)單錯(cuò)誤與邏輯錯(cuò)誤。

簡(jiǎn)單錯(cuò)誤

簡(jiǎn)單錯(cuò)誤包含語(yǔ)義錯(cuò)誤、內(nèi)存錯(cuò)誤等。對(duì)于這些容易分析的簡(jiǎn)單錯(cuò)誤,我們已經(jīng)有很多成熟的方法與工具來(lái)避免,如編譯器、靜態(tài)分析工具、Garbage Collector 等。由于這類(lèi)錯(cuò)誤可以比較容易地被發(fā)現(xiàn)與修復(fù),因此不是我們關(guān)注的重點(diǎn)。

邏輯錯(cuò)誤

邏輯錯(cuò)誤是程序中最難發(fā)現(xiàn)的錯(cuò)誤,也是最難修復(fù)的錯(cuò)誤,如死鎖、競(jìng)態(tài)條件、數(shù)據(jù)不一致等。邏輯錯(cuò)誤影響了程序的正確性、性能、可靠性等指標(biāo),通常是由于程序的設(shè)計(jì)不夠完善導(dǎo)致的。對(duì)于這類(lèi)錯(cuò)誤,我們需要從更高的層面來(lái)分析與設(shè)計(jì)程序,而非僅僅從代碼的實(shí)現(xiàn)細(xì)節(jié)來(lái)考慮。

我們通常會(huì)使用一些方法來(lái)避免邏輯錯(cuò)誤,如:

  • 優(yōu)化軟件架構(gòu)設(shè)計(jì)- 在設(shè)計(jì)階段就考慮程序的正確性,避免設(shè)計(jì)出不夠完善的程序
  • 測(cè)試- 使用各種測(cè)試方法來(lái)減少程序的錯(cuò)誤,但無(wú)法保證程序的完全正確
經(jīng)驗(yàn)不難看出,上述理論都是通過(guò)總結(jié)經(jīng)驗(yàn)得出的。經(jīng)驗(yàn)是在實(shí)踐中積累的,我們將經(jīng)驗(yàn)加以總結(jié),得出指導(dǎo)性的原則、方法與步驟,可以幫助我們?cè)O(shè)計(jì)出更好的程序。 我們能否僅依賴(lài)于經(jīng)驗(yàn)?

越有經(jīng)驗(yàn)的人往往能想到更多的細(xì)節(jié)與可能性,設(shè)計(jì)出的系統(tǒng)通常更穩(wěn)定。但我們不能僅僅依賴(lài)于經(jīng)驗(yàn):

  • 經(jīng)驗(yàn)有局限性- 人類(lèi)的經(jīng)驗(yàn)是有限且不可靠的
  • 復(fù)雜系統(tǒng)的行為、狀態(tài)太多- 一個(gè)復(fù)雜的系統(tǒng),其行為與狀態(tài)太多,很難通過(guò)經(jīng)驗(yàn)來(lái)預(yù)測(cè)
  • 特定程序?qū)φ_性的要求很高- 有些程序?qū)φ_性的要求很高,如金融系統(tǒng)、醫(yī)療系統(tǒng)等,這些程序的正確性很難通過(guò)經(jīng)驗(yàn)來(lái)保證
  • 無(wú)法從理論上驗(yàn)證正確性- 只能盡量減少錯(cuò)誤的發(fā)生,但無(wú)法從理論上證明程序的正確性

綜上,我們需要一種更加嚴(yán)謹(jǐn)?shù)姆椒ǎ瑥脑O(shè)計(jì)上保證程序的正確性。

形式化方法

如果能夠從數(shù)學(xué)角度驗(yàn)證一個(gè)程序的正確性,就可以解決上述的問(wèn)題,這就是形式化方法的目標(biāo)。

形式化方法基于數(shù)學(xué),通過(guò)為系統(tǒng)建立數(shù)學(xué)模型,來(lái)定義系統(tǒng)的行為、狀態(tài)等,然后定義系統(tǒng)的約束條件,如安全性、活性,最終證明模型滿(mǎn)足系統(tǒng)形式規(guī)約,來(lái)驗(yàn)證系統(tǒng)的正確性。對(duì)于有窮狀態(tài)的系統(tǒng),可以使用以窮盡搜索為基礎(chǔ)的模型檢測(cè),通過(guò)搜索待驗(yàn)證系統(tǒng)模型的有窮狀態(tài)空間來(lái)檢驗(yàn)該系統(tǒng)的行為是否具備預(yù)期屬性。對(duì)于有無(wú)窮狀態(tài)空間的系統(tǒng),使用邏輯推理為基礎(chǔ)的演繹驗(yàn)證,利用歸納法驗(yàn)證系統(tǒng)的正確性。

本文用 TLA+ 語(yǔ)言作為工具來(lái)介紹形式化方法。

2

TLA+

TLA+ 的作者是在并發(fā)和分布式系統(tǒng)領(lǐng)域做出開(kāi)創(chuàng)性貢獻(xiàn)的 2013 年圖靈獎(jiǎng)獲得者,計(jì)算機(jī)科學(xué)家 Leslie Lamport。

TLA+ 是一種用于對(duì)程序和系統(tǒng)進(jìn)行建模的高級(jí)語(yǔ)言——尤其是并發(fā)和分布式程序和系統(tǒng)。其核心思想是:精確描述事物的最佳方式是使用簡(jiǎn)單的數(shù)學(xué)。TLA+ 及其工具可用于消除的設(shè)計(jì)錯(cuò)誤,這些錯(cuò)誤很難在代碼中發(fā)現(xiàn)并且糾正起來(lái)代價(jià)高昂。

使用 TLA+ 編寫(xiě)的 specification 并不是真正的工程代碼,無(wú)法用在生產(chǎn)環(huán)境中,因?yàn)?TLA+ 的目標(biāo)是在系統(tǒng)設(shè)計(jì)階段就發(fā)現(xiàn)并解決邏輯錯(cuò)誤。在 TLA+ 中,我們將程序抽象為有窮狀態(tài)的數(shù)學(xué)模型,通常是狀態(tài)機(jī),然后利用 TLC Model Checker 窮盡程序所有可能到達(dá)的狀態(tài)并驗(yàn)證其正確性。

下面通過(guò)兩個(gè)簡(jiǎn)單的例子介紹 TLA+。這兩個(gè)例子均來(lái)自 TLA+ 作者的 Leslie Lamport's The TLA+ Video Course。本文的目標(biāo)是為沒(méi)有接觸過(guò)形式化方法的讀者提供一種新的視角看待計(jì)算機(jī)系統(tǒng)與算法,而不是 TLA+ 教程,因此不會(huì)過(guò)多介紹 TLA+ 的語(yǔ)法與工具的使用。

簡(jiǎn)單的例子

TLA+ 可以讓我們使用簡(jiǎn)單的數(shù)學(xué)抽象系統(tǒng)模型,主要是集合論與布爾邏輯。在抽象的過(guò)程中,我們要舍棄很多實(shí)現(xiàn)細(xì)節(jié),僅關(guān)注程序的邏輯本身。

下面是一個(gè)簡(jiǎn)單的 C 語(yǔ)言程序,我們嘗試將其抽象為一個(gè) TLA+ 程序:

inti;
voidmain(){
i=someNumber();//someNumber()用來(lái)得到一個(gè)0到1000之間的數(shù)字
i=i+1;
}
狀態(tài)抽象

我們需要將這個(gè)程序抽象為一個(gè)個(gè)獨(dú)立的狀態(tài)。很顯然,對(duì)于這個(gè)簡(jiǎn)單的程序,各狀態(tài)之間的不同點(diǎn)只有i的值。假設(shè)i在初始化后的默認(rèn)值是 0,且某次運(yùn)行這個(gè)程序時(shí)someNumber()返回了 42,那么這個(gè)程序存在的狀態(tài)轉(zhuǎn)換關(guān)系就是:

[i : 0] -> [i : 42] -> [i : 43]

這之中有三個(gè)狀態(tài),每個(gè)狀態(tài)間的區(qū)別均為i的值不同。

這樣看似完成了抽象,但是這個(gè)抽象還是有問(wèn)題的。假設(shè)在另一次運(yùn)行中,someNumber()返回了 43,那么這個(gè)程序的狀態(tài)轉(zhuǎn)換關(guān)系就是:

[i : 0] -> [i : 43] -> [i : 44]

這與之前的抽象不符,因?yàn)閮纱芜\(yùn)行的狀態(tài)轉(zhuǎn)換關(guān)系不同。這是因?yàn)槲覀儧](méi)有考慮到someNumber()的返回值。

程序的"狀態(tài)"是指程序運(yùn)行完成各個(gè)階段后的時(shí)間點(diǎn),而不是程序運(yùn)行的過(guò)程。因此,每個(gè)狀態(tài)都是獨(dú)立的,且狀態(tài)之間的轉(zhuǎn)換都是原子的。這與傳統(tǒng)的編程有很大的區(qū)別,因?yàn)閭鹘y(tǒng)的編程是面向過(guò)程的,而 TLA+ 是面向狀態(tài)的。我們只在乎目前程序運(yùn)行到了什么狀態(tài),因此可以引入一個(gè)變量pc來(lái)表示程序運(yùn)行到了哪個(gè)階段,這樣我們就可以清晰地表示程序的次態(tài)關(guān)系:

inti;
voidmain(){
i=someNumber();//pc="start"
i=i+1;//pc="middle"
}//pc="done"
這樣,我們不需要再考慮i的值,只需要考慮pc的值即可:

[pc : start] -> [pc : middle] -> [pc : done]

狀態(tài)編寫(xiě)

i的初始值為 0,pc的初始值為start,我們可以把次態(tài)關(guān)系寫(xiě)成:

cd616484-bc7d-11ed-bfe3-dac502259ad0.png

其中,對(duì)于變量i,它的下一個(gè)狀態(tài)表示為i',這是 TLA+ 中定義變量狀態(tài)轉(zhuǎn)換的方式。i' ∈ 0..1000代表i在下一個(gè)狀態(tài)的值是 0 到 1000 之間的一個(gè)數(shù),也就是someNumber()0..1000代表集合{0,1,...,1000}是布爾邏輯中的邏輯與,可以認(rèn)為意為"并且"。最終程序運(yùn)行完成,不會(huì)再有下一個(gè)狀態(tài),因此表示為FALSE

在 TLA+ 中,我們編寫(xiě)的是一個(gè)個(gè)狀態(tài)。因此,并非是"因?yàn)?/span>pc = start所以i' ∈ 0..1000",事實(shí)上兩者的關(guān)系是并列的:**在這個(gè)狀態(tài)中,pc的值是start并且i下一個(gè)狀態(tài)的值∈ 0..1000**。有了這樣的思想,我們可以將上面的抽象改寫(xiě)為:

cd74c10a-bc7d-11ed-bfe3-dac502259ad0.png

在其中用到了"或"連接兩個(gè)狀態(tài),我們可以用布爾邏輯中的邏輯或來(lái)表示。這樣,我們就可以清晰地表示出程序的狀態(tài)轉(zhuǎn)換關(guān)系了。為了美觀(guān),在 TLA+ 中,首句前也可以補(bǔ)上相同的布爾邏輯符號(hào):

cd88f710-bc7d-11ed-bfe3-dac502259ad0.png

我們最終得到了這個(gè)簡(jiǎn)單程序在初始狀態(tài)后的兩個(gè)狀態(tài),下面我們將初始狀態(tài)補(bǔ)全,并按照 TLA+ 語(yǔ)言的要求補(bǔ)全整個(gè) specification:

cd9c59ea-bc7d-11ed-bfe3-dac502259ad0.png

  • EXTENDS用于引入其他 specification 中定義的 module,這里引入了標(biāo)準(zhǔn)庫(kù)中的Integers,主要用在i' ∈ 0..1000上。
  • VARIABLES用于定義變量,這里定義了ipc
  • Init用于定義初始狀態(tài),這里定義了i = 0pc = "start"
  • Next用于定義狀態(tài)轉(zhuǎn)換關(guān)系。
這樣我們就得到了一個(gè)完整的 TLA+ specification。后面就可以使用 TLC Model Checker 來(lái)檢查模型了,不過(guò)這不屬于本文的范圍。對(duì)于簡(jiǎn)單的系統(tǒng),用 TLA+ 建模并不能帶來(lái)很多好處。一般來(lái)說(shuō),只有在設(shè)計(jì)很復(fù)雜、很關(guān)鍵、很靠經(jīng)驗(yàn)預(yù)測(cè)的系統(tǒng)時(shí),TLA+ 才會(huì)被使用。并發(fā)與分布式系統(tǒng)是 TLA+ 通常被使用的領(lǐng)域。下面我們就來(lái)看一個(gè)分布式系統(tǒng)算法的例子:Two-Phase Commit。 Two-Phase Commit

二階段提交(英語(yǔ):Two-phase Commit)是指在計(jì)算機(jī)網(wǎng)絡(luò)以及數(shù)據(jù)庫(kù)領(lǐng)域內(nèi),為了使基于分布式系統(tǒng)架構(gòu)下的所有節(jié)點(diǎn)在進(jìn)行事務(wù)提交時(shí)保持一致性而設(shè)計(jì)的一種算法。通常,二階段提交也被稱(chēng)為是一種協(xié)議(Protocol)。在分布式系統(tǒng)中,每個(gè)節(jié)點(diǎn)雖然可以知曉自己的操作時(shí)成功或者失敗,卻無(wú)法知道其他節(jié)點(diǎn)的操作的成功或失敗。當(dāng)一個(gè)事務(wù)跨越多個(gè)節(jié)點(diǎn)時(shí),為了保持事務(wù)的ACID特性,需要引入一個(gè)作為協(xié)調(diào)者的組件來(lái)統(tǒng)一掌控所有節(jié)點(diǎn)(稱(chēng)作參與者)的操作結(jié)果并最終指示這些節(jié)點(diǎn)是否要把操作結(jié)果進(jìn)行真正的提交(比如將更新后的數(shù)據(jù)寫(xiě)入磁盤(pán)等等)。因此,二階段提交的算法思路可以概括為:參與者將操作成敗通知協(xié)調(diào)者,再由協(xié)調(diào)者根據(jù)所有參與者的反饋情報(bào)決定各參與者是否要提交操作還是中止操作。——Two-Phase Commit (Wikipedia)

Leslie Lamport's The TLA+ Video Course中,Lamport 以這樣的方式類(lèi)比解釋 Two-Phase Commit:

cdbddd18-bc7d-11ed-bfe3-dac502259ad0.png

在婚禮上,牧師是協(xié)調(diào)者,新郎和新娘是參與者。當(dāng)新郎和新娘都同意婚事時(shí),牧師才會(huì)正式宣布婚事。如果有一方不同意,牧師就會(huì)中止婚事:

  1. 牧師問(wèn)新郎:你是否同意這件婚事?
  2. 新郎回答:我同意(prepared)。
  3. 牧師問(wèn)新娘:你是否同意這件婚事?
  4. 新娘回答:我同意(prepared)。
  5. 牧師宣布:婚事正式成立(committed)。

如果其中有一方不同意,牧師就會(huì)中止(abort)婚事。

在數(shù)據(jù)庫(kù)中,Transaction Manager 是協(xié)調(diào)者(牧師)。當(dāng) Transaction Manager 詢(xún)問(wèn)所有參與者 Resource Managers (新郎 / 新娘)時(shí),如果所有 Resource Managers 都同意提交事務(wù),Transaction Manager 就會(huì)把事務(wù)提交。如果有一方不同意,Transaction Manager 就會(huì)中止事務(wù)。

Two-Phase Commit 的詳細(xì)介紹與流程可以在Wikipedia上找到。

首先我們來(lái)定義一些常量與變量以及其初始狀態(tài):


cdd8ae68-bc7d-11ed-bfe3-dac502259ad0.png

  • 常量RM是所有 Resource Manager 標(biāo)識(shí)的集合,例如可以設(shè)為集合{"r1", "r2", "r3"}
  • 變量rmState用于記錄每個(gè) Resource Manager 的狀態(tài),用rmState[r]表示r的狀態(tài),有workingpreparedcommittedaborted四種狀態(tài),每個(gè)RM的初始狀態(tài)均為working
  • 變量tmState用于記錄 Transaction Manager 的狀態(tài),有initcommittedaborted三種狀態(tài),初始狀態(tài)為init
  • 變量tmPrepared用于記錄已經(jīng)準(zhǔn)備好(處于prepared狀態(tài))的 Resource Manager,初始值是一個(gè)空集。
  • 變量msgs作為消息池,用于記錄所有正在傳輸?shù)南ⅲ跏贾凳且粋€(gè)空集。

下面我們來(lái)定義系統(tǒng)做可能發(fā)生的動(dòng)作。

cdecb1f6-bc7d-11ed-bfe3-dac502259ad0.png

  • TLA+ 中可以用上述方式定義類(lèi)似于其它編程語(yǔ)言中"函數(shù)"概念的表達(dá)式,這樣就無(wú)需對(duì)每一個(gè) Resource Manager 都定義一個(gè)表達(dá)式了。
  • [type → "prepare", rm → r]是一個(gè) TLA+ 中的 record,類(lèi)似于其它編程語(yǔ)言中的 struct。
  • UNCHANGED ?rmState, tmState, msgs?表示這個(gè)動(dòng)作不會(huì)改變rmStatetmStatemsgs這三個(gè)變量的值。在 TLA+ 中,每一個(gè)變量的值是否改變都需要顯式地聲明。

當(dāng)TM的狀態(tài)為init,且在消息池中存在來(lái)自rPrepared消息,tmPrepared在下一個(gè)狀態(tài)的值會(huì)是tmPrepared{r}的并集。

cdffdb0a-bc7d-11ed-bfe3-dac502259ad0.png上面的兩個(gè)動(dòng)作分別是 Transaction Manager 進(jìn)行 Commit 與 Abort。

ce104e22-bc7d-11ed-bfe3-dac502259ad0.png

上述 4 個(gè) Resource Manager 動(dòng)作分別是 Resource Manager 選擇 Prepare 與 Abort,以及處理由 Transaction Manager 決定的 Commit 與 Abort。

其中,存在語(yǔ)法如rmState' = [rmState except ![r] = "prepared"],意為"在下一個(gè)狀態(tài)中,rmState[r]的值變?yōu)?/span>prepared,其它部分不變"。

如果我們用形如rmState[r]' = "prepared"的形式來(lái)表示,我們并沒(méi)有顯式地說(shuō)明rmState的其它部分在下一個(gè)狀態(tài)的值,因此是不正確的。

TLA+ 與我們通常編寫(xiě)的程序不同,是數(shù)學(xué)。在編程中,我們會(huì)使用到數(shù)組,而在 TLA+ 中,我們使用函數(shù)來(lái)表達(dá)類(lèi)似的概念,數(shù)組的下標(biāo)組成的集合就是函數(shù)的定義域。

編寫(xiě)完系統(tǒng)可能存在的所有動(dòng)作后,我們就可以開(kāi)始?xì)w納系統(tǒng)的狀態(tài)轉(zhuǎn)換了:

ce279424-bc7d-11ed-bfe3-dac502259ad0.png

其中,我們使用存在量詞?r ∈ RM來(lái)表示"對(duì)于集合RM的任意元素r,都存在這種行為"。TLA+ 的狀態(tài)轉(zhuǎn)換是原子的,因此在一個(gè)狀態(tài)中這個(gè)"或"分支內(nèi)只會(huì)有一個(gè)r被選擇,這可以類(lèi)比為編程語(yǔ)言中的for r in RM,但在本質(zhì)上不同。

至此,對(duì)系統(tǒng)的建模就完成了。下面我們需要編寫(xiě)系統(tǒng)的約束條件:

ce3e1640-bc7d-11ed-bfe3-dac502259ad0.png

在約束條件TypeOK中,我們將每個(gè)變量的可能值都進(jìn)行了限制。其中的[RM → {"working","prepared", "committed", "aborted"}]是類(lèi)似于將集合RM與集合{"working", "prepared", "committed", "aborted"}做笛卡爾積的操作,但得到的是一個(gè)由 record 組成的集合:
{
[r1|->"working",r2|->"working"],
[r1|->"working",r2|->"prepared"],
[r1|->"working",r2|->"committed"],
...
[r1|->"aborted",r2|->"committed"],
[r1|->"aborted",r2|->"aborted"]
}
TypeOK中我們用到了上面定義的集合Messages。定義Messages時(shí),我們使用了語(yǔ)法:[type: {"Prepared"}, rm: RM]。這種語(yǔ)法也是對(duì){"Prepared"}RM做類(lèi)似笛卡爾積的操作,但得到的也是一個(gè) record 集合:

{
[type|->"Prepared",rm|->r1],
[type|->"Prepared",rm|->r2],
...
}

最后的約束條件Consistent用于保證系統(tǒng)的一致性:在任意時(shí)刻,系統(tǒng)中不可能存在兩個(gè) Resource Managers 分別處于committedabort狀態(tài)。

最終,我們將約束條件作為不變量,與系統(tǒng)模型一起交給 TLC Model Checker 進(jìn)行驗(yàn)證,就可以證明系統(tǒng)的正確性。

3

總結(jié)

通過(guò)上面的兩個(gè)例子,我們初步了解形式化方法的思想。TLA+ 是為了驗(yàn)證分布式系統(tǒng)而設(shè)計(jì)的,但其思想可以應(yīng)用到的領(lǐng)域遠(yuǎn)不止分布式系統(tǒng)。在編寫(xiě)程序時(shí),如果我們能夠不僅僅考慮代碼層面的內(nèi)容,而是從更高的層面,從數(shù)學(xué)角度去思考,就能夠?qū)懗龈咏训某绦颉?/span>如果你對(duì) TLA+ 感興趣,可以參考Leslie Lamport's The TLA+ Video Course - YouTubeLearn TLA+

4

我們的項(xiàng)目:Xline

TLA+被廣泛用于分布式系統(tǒng)算法的研究和開(kāi)發(fā)中。在我們的項(xiàng)目Xline中,TLA+被用來(lái)在設(shè)計(jì)階段驗(yàn)證共識(shí)算法的正確性。

Xline是一個(gè)用于元數(shù)據(jù)管理的分布式KV存儲(chǔ)。我們?cè)赬line中使用CURP協(xié)議(https://www.usenix.org/system/files/nsdi19-park.pdf)的修改版作為共識(shí)協(xié)議,TLA+將被用于其正確性驗(yàn)證中。

如果你想了解更多關(guān)于Xline的信息,請(qǐng)參考我們的Github:https://github.com/datenlord/Xline


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4630

    瀏覽量

    93364
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3796

    瀏覽量

    81419
  • 架構(gòu)設(shè)計(jì)

    關(guān)注

    0

    文章

    32

    瀏覽量

    6976

原文標(biāo)題:從數(shù)學(xué)角度思考程序與驗(yàn)證正確性

文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一種新型半自動(dòng)驗(yàn)證流程 SoC連通性的正確性

    設(shè)計(jì)中的邏輯模塊之間的連接是否正確,例如:模塊 B1 上的輸出 A 是否正確連接到模塊 B2 上的輸入 A''。這常常是很困難的驗(yàn)證任務(wù)。設(shè)計(jì)包含數(shù)以千計(jì)的導(dǎo)線(xiàn),這些導(dǎo)線(xiàn)的正確性可能都
    的頭像 發(fā)表于 12-22 15:54 ?2524次閱讀
    一種新型半自動(dòng)<b class='flag-5'>驗(yàn)證</b>流程 SoC連通性的<b class='flag-5'>正確性</b>

    基于SMT的并發(fā)程序驗(yàn)證中約束求解問(wèn)題

    本質(zhì)上講,要驗(yàn)證一個(gè)程序正確性,需要驗(yàn)證程序中所有執(zhí)行都正確。對(duì)并發(fā)
    的頭像 發(fā)表于 02-02 09:25 ?2344次閱讀
    基于SMT的并發(fā)<b class='flag-5'>程序驗(yàn)證</b>中約束求解問(wèn)題

    ADS5282如何通過(guò)其他方式驗(yàn)證寄存器寫(xiě)入的正確性

    word. 測(cè)試結(jié)果: (1)差分?jǐn)?shù)據(jù)對(duì)N端無(wú)變化 (2)差分P端輸出300多mv電壓,差分N端輸出100多mv電壓 另外,ADS5282是只寫(xiě)芯片,如何通過(guò)其他方式驗(yàn)證寄存器寫(xiě)入的正確性
    發(fā)表于 11-18 08:33

    沒(méi)有實(shí)驗(yàn)設(shè)備的條件下,如何首先驗(yàn)證程序正確性

    沒(méi)有實(shí)驗(yàn)設(shè)備,也就是說(shuō)沒(méi)有傳感器,數(shù)據(jù)采集卡等,如何首先驗(yàn)證程序正確性?謝謝!
    發(fā)表于 06-04 16:04

    架構(gòu)的角度看如何寫(xiě)好代碼 + 我的思考

    架構(gòu)漫談(八):架構(gòu)的角度看如何寫(xiě)好代碼 + 我的思考
    發(fā)表于 06-18 06:16

    ACRN 之InterruptWindow功能正確性形式化驗(yàn)證

    重磅推薦|ACRN 之InterruptWindow功能正確性形式化驗(yàn)證
    發(fā)表于 06-18 16:04

    如何去測(cè)試CAN接口通訊功能的正確性

    如何去測(cè)試CAN接口通訊功能的正確性呢?怎樣去設(shè)計(jì)驅(qū)動(dòng)控制板的CAN通訊接口部分呢?
    發(fā)表于 11-09 07:30

    疊加原理的驗(yàn)證

    疊加原理的驗(yàn)證 一、實(shí)驗(yàn)?zāi)康?b class='flag-5'>驗(yàn)證線(xiàn)性電路疊加原理的正確性,加深對(duì)線(xiàn)性電路的疊加和齊次的認(rèn)識(shí)和理解。二、原理說(shuō)
    發(fā)表于 09-24 09:30 ?3.5w次閱讀
    疊加原理的<b class='flag-5'>驗(yàn)證</b>

    驗(yàn)證了LCL型濾波器參數(shù)設(shè)計(jì)及光伏并入配電網(wǎng)的逆變器電壓控制策略的正確性

    濾波器的原理入手,對(duì)單L型和LCL型濾波器原理進(jìn)行對(duì)比分析,在設(shè)計(jì)方法上,對(duì)比傳統(tǒng)的分步設(shè)計(jì)法,本文選擇了基于粒子群算法的新型LCL型濾波器的參數(shù)設(shè)計(jì)方法,最后通過(guò)仿真分析驗(yàn)證了LCL型濾波器的參數(shù)設(shè)計(jì)及所研究的光伏并入配電網(wǎng)的逆變器電壓控制策略的
    的頭像 發(fā)表于 01-17 16:00 ?8555次閱讀
    <b class='flag-5'>驗(yàn)證</b>了LCL型濾波器參數(shù)設(shè)計(jì)及光伏并入配電網(wǎng)的逆變器電壓控制策略的<b class='flag-5'>正確性</b>

    工程師和數(shù)學(xué)家的區(qū)別在哪

    工程師追求的是結(jié)果的正確性,而數(shù)學(xué)家要的是過(guò)程的正確性。 過(guò)程可以不夠準(zhǔn)確,但是可以用一些其他的辦法來(lái)保證結(jié)果的正確性
    的頭像 發(fā)表于 03-31 10:34 ?3429次閱讀

    如何驗(yàn)證區(qū)塊鏈開(kāi)發(fā)程序驗(yàn)證程序正確性

    智能合約是一種自我執(zhí)行的工具,它的增長(zhǎng)是隨著區(qū)塊鏈的興起而出現(xiàn)的。隨著這項(xiàng)技術(shù)的采用,這些金融工具的實(shí)際存款額不斷增加,同時(shí)它們的復(fù)雜也嚴(yán)重升級(jí)。這種情況會(huì)周期性地導(dǎo)致代價(jià)高昂的bug和漏洞,從而為更嚴(yán)格的程序分析方法帶來(lái)光明。
    發(fā)表于 06-25 10:55 ?4199次閱讀
    如何<b class='flag-5'>驗(yàn)證</b>區(qū)塊鏈開(kāi)發(fā)<b class='flag-5'>程序</b>和<b class='flag-5'>驗(yàn)證</b><b class='flag-5'>程序</b>的<b class='flag-5'>正確性</b>

    如何檢查系統(tǒng)集成的正確性

    和交互進(jìn)行驗(yàn)證。 v?裝配程序和裝配工具是可用的,并在開(kāi)始裝配之前進(jìn)行驗(yàn)證。 v?在開(kāi)始驗(yàn)證之前,VV程序和工具是可用的并經(jīng)過(guò)
    的頭像 發(fā)表于 02-13 13:49 ?2165次閱讀
    如何檢查系統(tǒng)集成的<b class='flag-5'>正確性</b>?

    通過(guò)靜態(tài)時(shí)序分析驗(yàn)證設(shè)計(jì)的正確性

      傳統(tǒng)的電路設(shè)計(jì)分析方法是僅僅采用動(dòng)態(tài)仿真的方法來(lái)驗(yàn)證設(shè)計(jì)的正確性。隨著集成電路的發(fā)展,這一驗(yàn)證方法就成為了大規(guī)模復(fù)雜的設(shè)計(jì)驗(yàn)證時(shí)的瓶頸。
    的頭像 發(fā)表于 11-28 15:26 ?1044次閱讀

    基于形式驗(yàn)證的高效RISC-V處理器驗(yàn)證方法

    隨著RISC-V處理器的快速發(fā)展,如何保證其正確性成為了一個(gè)重要的問(wèn)題。傳統(tǒng)的測(cè)試方法只能覆蓋一部分錯(cuò)誤情況,而且無(wú)法完全保證處理器的正確性。因此,基于形式驗(yàn)證的方法成為了一個(gè)非常有前途的方法,可以更加全面地
    的頭像 發(fā)表于 06-02 10:35 ?1447次閱讀

    如何使用Verilog語(yǔ)言進(jìn)行仿真驗(yàn)證

    仿真驗(yàn)證主要作用是搭建一個(gè)測(cè)試平臺(tái),測(cè)試和驗(yàn)證程序設(shè)計(jì)的正確性驗(yàn)證設(shè)計(jì)是否實(shí)現(xiàn)了我們所預(yù)期的功能。其結(jié)構(gòu)如下圖所示。
    的頭像 發(fā)表于 10-02 16:29 ?1913次閱讀
    如何使用Verilog語(yǔ)言進(jìn)行仿真<b class='flag-5'>驗(yàn)證</b>
    优博开户| 虎林市| 免费百家乐追号| 百家乐视频游戏盗号| 百家乐官网投注方法多不多| 3u娱乐城| 顶级赌场连环夺宝| 澳门百家乐怎么下载| 百家乐赌博程序| 百家乐有赢钱公式吗| 百家乐官网策略网络游戏信誉怎么样| 百家乐官网平注常赢法| 百家乐过滤工具| 百家乐跟路技巧| 百家乐免费试玩游戏| 汉百家乐官网春| 娱百家乐官网下载| 百家乐官网发牌靴遥控| 百家乐官网现金网平台排行榜| 百家乐官网策略| 黄梅县| 汉阴县| 皇冠网代理| 天下足球网| 亲朋棋牌游戏下载| 大发888娱乐城真钱| 威尼斯人娱乐场官网是多少| 蓝盾百家乐赌城| 百家乐桌布尼布材质| 澳门百家乐有赢钱的吗| 永利高百家乐进不去| 百家乐怎么样玩| 迷你百家乐论坛| 24山亥山巳向造葬日课| 百家乐官网桌套装| 姚记百家乐官网的玩法技巧和规则| 网络百家乐官网金海岸| 百家乐官网投注哪个信誉好| 百家乐官网视频游戏中心| 百家乐官网娱乐城提款| 百家乐官网不倒翁缺点|