我无法理解以下关于命题逻辑和蕴涵的算法,取自“人工智能现代方法”一书。
用于决定命题蕴涵的真值表枚举算法。 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)
答案 0 :(得分:7)
当然,TT-ENTAILS
唯一能做的就是用适当的参数调用TT-CHECK-ALL
,所以这里没什么好说的。有趣的位从else
的{{1}}部分开始,递归地为知识库和查询中出现的符号的所有可能赋值构建巨大的连接('模型)。
例如,TT-CHECK-ALL
将评估为
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])
)
的第一部分,当所有符号在模型中被赋予一个值时执行,检查给定的模型,例如[P = true,Q = false]与知识库(TT-CHECK-ALL
)一致。这些模型对应于真值表中的行,其在KB列中具有PL-TRUE?(KB, model)
。对于那些,算法然后检查查询是否评估为真(true
)。通过返回PL-TRUE?(query, model)
,这是共轭的中性元素,不考虑所有其他与KB首先不一致的模型。
换句话说,这与true
相同。
简而言之,TT-CHECK-ALL检查每个模型(每个可能的'true'或'false'分配给不同符号)与KB一致的查询评估为真:
PL-TRUE?(KB, model) -> PL-TRUE?(query, model)
在逻辑上等同于
foreach model: PL-TRUE?(KB, model) -> PL-TRUE?(query, model)
也就是说,没有模型,因此查询的KB和否定都可以为真,即查询的KB和否定是< em>逻辑上不一致。
这正是not exist model: PL-TRUE?(KB, model) and not PL-TRUE?(query, model)
的定义。
修改强>
关于KB entails query
。这些是词汇表中的原子命题符号。在书中的例子中,那些是symbols
和P_i,j
,表示房间(i,j)是否有坑和/或微风。请注意,B_i,j
到R1
不属于R5
,因为这些只是方便的缩写,代表更复杂的术语。因此,在将symbols
传递给算法时,我们不会传递KB
,而是传递R1 and R2 and ... R5
。
答案 1 :(得分:-1)
TT-CHECK-ALL(KB,α,符号,型号)
在第一次迭代时,TT-CHECK-ALL的第二部分
i) TT-CHECK-ALL(KB,a,Q,Extend(P,true,[]))
at first
TT-CHECK-ALL(KB,a,Q,Extend(P,false,[]))
然后发生什么托比亚斯说。
最后有一个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不为true,则不检查alpha是否为true。重点是,如果alpha知识库的每个(真实)模型中的查询都是真的。如果在每个真正的知识库(模型)中所有的alpha都是真的。如果在每个真知识库(模型)中alpha不为真,那么alpha的值可能再次出现。那么我们无法确定那个问题。
exmp:在wumpus-world例子中,相关命题 符号是B1,1,B1,2,P1,2,P2,1,P2,3和P3,1。有七个符号,有 27 = 128种可能的型号;在其中三个中,KB(这些符号的不同值的结合)是真实的。在这三个模型中, -p1,2为真,因此[1,2]中没有凹坑。另一方面,P2,1在三者中的两个中为真 模型和假一体,所以我们还不知道[2,2]中是否有一个坑。TT-entails算法的全部要点,用我所拥有的知识库来查看查询是否有答案。知识库(模型)是真实的,查询(一个命题句)在所有这些中都是真的然后BINGO! :)
我发现托比亚斯的解释非常有帮助。只是考虑添加一些elimentry东西,以使其更好。