我有个问题。我试图理解一阶逻辑,因此我找到了以下代码:
# Import libraries
import aima.utils
import aima.logic
# The main entry point for this module
def main():
# Create an array to hold clauses
clauses = []
# Add first-order logic clauses (rules and fact)
clauses.append(aima.utils.expr("(American(x) & Weapon(y) & Sells(x, y, z) & Hostile(z)) ==> Criminal(x)"))
clauses.append(aima.utils.expr("Enemy(Nono, America)"))
clauses.append(aima.utils.expr("Owns(Nono, M1)"))
clauses.append(aima.utils.expr("Missile(M1)"))
clauses.append(aima.utils.expr("(Missile(x) & Owns(Nono, x)) ==> Sells(West, x, Nono)"))
clauses.append(aima.utils.expr("American(West)"))
clauses.append(aima.utils.expr("Missile(x) ==> Weapon(x)"))
# Create a first-order logic knowledge base (KB) with clauses
KB = aima.logic.FolKB(clauses)
# Add rules and facts with tell
KB.tell(aima.utils.expr('Enemy(Coco, America)'))
KB.tell(aima.utils.expr('Enemy(Jojo, America)'))
KB.tell(aima.utils.expr("Enemy(x, America) ==> Hostile(x)"))
# Get information from the knowledge base with ask
hostile = aima.logic.fol_fc_ask(KB, aima.utils.expr('Hostile(x)'))
criminal = aima.logic.fol_fc_ask(KB, aima.utils.expr('Criminal(x)'))
# Print answers
print('Hostile?')
print(list(hostile))
print('\nCriminal?')
print(list(criminal))
print()
# Tell python to run main method
if __name__ == "__main__": main()
现在我不明白一件事:
我什么时候用这个:clauses.append(aima.utils.expr()
什么时候用这个:KB.tell(aima.utils.expr()
这两个都是事实,但我真的不明白为什么你必须以不同的方式设定一些事实。 这里是论坛的链接:https://www.annytab.com/first-order-logic-in-python/?unapproved=2276&moderation-hash=66a786c6e08ac109543a3518a62ea729#comment-2276
请让我知道
在我看来,首先在
clause
数组中创建一个子句列表。然后,您可以使用它初始化知识库KB
使用
tell()
方法,您可以向知识库中添加更多的表达式/子句原则上,它们是等效的,因为这两种方法都会将子句添加到知识库中,只有一些在初始化时添加,其他则在初始化后添加
您可能有一个固定的特定设置/域,以及针对不同问题的不同表达式,因此您可以在开始时放入所有常用表达式,并在以后的处理过程中添加其他表达式
相关问题 更多 >
编程相关推荐