非確定性計(jì)算(Nodeterministic Computing) 能夠?qū)Σ煌目赡苄赃M(jìn)行探索,得出符合條件的其中一種結(jié)果弊仪,除此之外杖刷,非確定性計(jì)算還可以對(duì)選擇點(diǎn)(進(jìn)行可能性選擇的節(jié)點(diǎn))進(jìn)行回溯驳癌,對(duì)新的可能性進(jìn)行探索。雖然每次非確定性計(jì)算只能得到一種可能性結(jié)果颓鲜,但不斷使用回溯操作便會(huì)產(chǎn)生新的可能性結(jié)果表窘,直到所有可能性窮盡為止。
要實(shí)現(xiàn)非確定性求值器需要通過 amb
特殊形式乐严,所以非確定性編程語言的求值器稱為 amb 求值器瘤袖。amb
的語法為 (amb <e1> <e2> ... <en>)
昂验,返回結(jié)果為 n 個(gè)表達(dá)式中的任意一個(gè)捂敌。如果 amb
中如果沒有任何選擇(也就是沒有傳遞任何表達(dá)式作為參數(shù))它就是一個(gè)沒有可訪問值的表達(dá)式既琴。在 amb 求值器中通痴纪瘢可以通過沒有任何表達(dá)式的 amb
表達(dá)式 ((amb)
)表示可能性探索的失敗(也就是可能性窮盡)甫恩。
在之前的求值器中逆济,計(jì)算一個(gè)表達(dá)式的結(jié)果需要表達(dá)式和對(duì)應(yīng)的計(jì)算環(huán)境,而在 amb 求值器磺箕,除了表達(dá)式和對(duì)應(yīng)的計(jì)算環(huán)境之外,還需要提供兩個(gè)延續(xù)程式松靡,一個(gè)為成功延續(xù)程式击困,另一個(gè)為失敗延續(xù)程式。當(dāng)表達(dá)式計(jì)算成功時(shí),會(huì)將表達(dá)式計(jì)算結(jié)果和失敗延續(xù)程式通過成功延續(xù)程式繼續(xù)向下傳導(dǎo)蹦浦,如果出現(xiàn)失敗情況(選擇點(diǎn)的可能性窮盡或當(dāng)前選擇路徑中不符合預(yù)期條件)則會(huì)通過失敗延續(xù)程式傳導(dǎo)。失敗延續(xù)程式傳導(dǎo)的結(jié)果一般會(huì)有兩種情況撞蜂,一種情況是回到前一選擇點(diǎn)選取另一種未曾嘗試的可能性推進(jìn)蝌诡,或者回到頂級(jí)驅(qū)動(dòng)循環(huán)中(所有的可能性都已經(jīng)窮盡時(shí))提示操作人員沒有更多的可能性進(jìn)行嘗試溉贿。
amb 求值器與惰性求值器最大不同在于,惰性求值器通過將元素組合的時(shí)間和計(jì)算具體元素的時(shí)間解耦浦旱,制造了一個(gè)當(dāng)前列表或流中已經(jīng)完成所有元素計(jì)算的假象宇色。而 amb 求值器如同將時(shí)間分解成了多個(gè)時(shí)間分支,每個(gè)時(shí)間分支表示不同的可能性,并且時(shí)間分支可以進(jìn)行回溯操作宣蠕。