[英]Confusion in propositional logic algorithm
我無法理解以下與命題邏輯和蘊涵有關的算法,該算法取自《人工智能一種現代方法》一書。
用於確定命題蘊含度的真值表枚舉算法。 TT代表真相表。 PL-TRUE? 如果句子包含在模型中,則返回true。 變量模型僅代表部分變量的部分模型分配。 函數調用EXTEND(P,true,model)返回一個新的局部模型,其中P的值為true。
function TT-ENTAILS? (KB,α) returns true or false
inputs: KB, the knowledge base, a sentence in propositional logic
α, the query, a sentence in propositional logic
symbols <--- a list of the propositional symbols in KB and α
return TT-CHECK-ALL(KB,α,symbols,[])
function TT-CHECK-ALL(KB,α,symbols,model ) returns true or false
if EMPTY?(symbols) then
if PL-TRUE?(KB, model) then return PL-TRUE?(α,model)
else return true
else do
P <---FIRST(symbols); rest <--- REST(symbols)
return TT-CHECK-ALL(KB,α,rest,EXTEND(P,true,model) and
TT-CHECK-ALL(KB, α, rest, EXTEND(P,false,model)
當然, TT-ENTAILS
唯一要做的就是使用適當的參數調用TT-CHECK-ALL
,因此這里沒有太多要說的。 有趣的部分始於TT-CHECK-ALL
的else
部分,該部分遞歸地為知識庫和查詢中出現的符號(“模型”)的所有可能賦值構造一個巨大的合集。
例如, TT-CHECK-ALL(KB, a, [P, Q], [])
將計算為
(
TT-CHECK-ALL(KB, a, [], [P=true, Q=true])
and
TT-CHECK-ALL(KB, a, [], [P=true, Q=false])
)
and
(
TT-CHECK-ALL(KB, a, [], [P=false, Q=true])
and
TT-CHECK-ALL(KB, a, [], [P=false, Q=false])
)
TT-CHECK-ALL
的第一部分在模型中所有符號均已賦予值時執行,它檢查給定的模型(例如[P = true,Q = false])是否與知識庫一致( PL-TRUE?(KB, model)
)。 這些模型對應於真值表中的行,這些行在KB列中為true
。 對於那些,算法然后檢查查詢是否評估為true( PL-TRUE?(query, model)
)。 通過返回true
(它是共軛的中性元素),不會考慮所有其他與KB不一致的模型。
換句話說,這與PL-TRUE?(KB, model) -> PL-TRUE?(query, model)
。
簡而言之,TT-CHECK-ALL會檢查每個與KB一致的模型(對不同符號的每個可能的“ true”或“ false”賦值),查詢結果是否為true:
foreach model: PL-TRUE?(KB, model) -> PL-TRUE?(query, model)
在邏輯上等價於
not exist model: PL-TRUE?(KB, model) and not PL-TRUE?(query, model)
也就是說,沒有模型,使得KB和查詢的取反都可以為真,即KB和查詢的取反在邏輯上是不一致的 。
而這恰恰是KB entails query
的定義KB entails query
。
編輯:關於symbols
。 這些是詞匯中的原子命題符號。 在書中的示例中,這些將是各種P_i,j
和B_i,j
,表示房間(i,j)是否有坑和/或微風。 請注意, R1
到R5
不是symbols
一部分,因為它們只是為了方便起見,代表更復雜的術語。 因此,當將KB
傳遞給算法時,我們不會傳遞R1 and R2 and ... R5
,而是(not P_1,1) and (B_1,1 <=> (P_1,2 or P_2,1)) and ... and (B_2,1)
。
TT-CHECK-ALL(KB,α,symbols,model)在第一次迭代中,TT-CHECK-ALL的第二部分i) TT-CHECK-ALL(KB,a,Q,Extend(P,true,[])) at first TT-CHECK-ALL(KB,a,Q,Extend(P,false,[]))
然后執行tobias所說的。
最后,所有這些TT-CHECK-ALL()從TT-entails函數返回。
ii) (TT-CHECK-ALL(KB, a, [], [P=true, Q=true]) and TT-CHECK-ALL(KB, a, [], [P=true, Q=false])) and (TT-CHECK-ALL(KB, a, [], [P=false, Q=true]) and TT-CHECK-ALL(KB, a, [], [P=false, Q=false]))
PS。 如果為EMPTY?(符號),則如果為PL-TRUE?(KB,模型),則返回PL-TRUE?(α,模型)
在i)上,符號不為空,有q,所以它將移至TT-CHECK-ALL的第二部分,但是在ii)上,符號為空,它將移至第一部分(KB,model),如果model不正確,則不檢查alpha是否正確。 整個問題是,如果使用alpha,則在知識庫的所有(true)模型中查詢都是正確的。 如果在每個真實的知識庫(模型)中所有alpha都成立。 如果每個真實知識庫(模型)中的alpha都不正確,則alpha的值又可能變為可能。 那么我們不能確定該查詢。
例題:在wumpus-world示例中,相關的命題符號為B1、1,B1,2,P1,2,P2,1,P2,3和P3,1。 有七個符號,就有27 = 128個可能的模型; 在其中的三個中,KB(這些符號的不同值的結合)是正確的。 在這三個模型中,-p1,2為真,因此在[1,2]中沒有凹坑。 另一方面,P2,1在三個模型中的兩個中為true,在一個模型中為false,因此我們尚無法確定[2,2]中是否存在凹坑。
TT-entails算法的整個要點是,借助我所擁有的知識庫,您可以看到查詢是否具有答案。 知識庫(模型)是正確的,而查詢(一個命題句子)在所有條件下都是正確的,那么BINGO! :)
我發現tobias的解釋非常有幫助。 只是考慮添加一些裝飾品,以使其更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.