FOL 创建规则
FOL Creating rules
我有一个问题。我试图理解一阶逻辑,所以我找到了这段代码:
# 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()
两者都是事实,但我真的不明白为什么你必须以不同的方式设置一些事实。
这是论坛的 link:https://www.annytab.com/first-order-logic-in-python/?unapproved=2276&moderation-hash=66a786c6e08ac109543a3518a62ea729#comment-2276
请告诉我!
据我所知,您首先在 clause
数组中创建一个子句列表。然后你用它来初始化知识库 KB
.
使用 tell()
方法,您可以 expressions/clauses 向知识库添加更多内容。
原则上它们是等价的,因为这两种方式都会将子句添加到知识库中,只有一些在初始化时,其他的在之后。
你可能有一个特定的setting/domain是固定的,针对不同的问题有不同的表达方式,所以你可以把所有常见的表达方式放在最前面,然后在处理过程中添加其他的。
我有一个问题。我试图理解一阶逻辑,所以我找到了这段代码:
# 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()
两者都是事实,但我真的不明白为什么你必须以不同的方式设置一些事实。 这是论坛的 link:https://www.annytab.com/first-order-logic-in-python/?unapproved=2276&moderation-hash=66a786c6e08ac109543a3518a62ea729#comment-2276
请告诉我!
据我所知,您首先在 clause
数组中创建一个子句列表。然后你用它来初始化知识库 KB
.
使用 tell()
方法,您可以 expressions/clauses 向知识库添加更多内容。
原则上它们是等价的,因为这两种方式都会将子句添加到知识库中,只有一些在初始化时,其他的在之后。
你可能有一个特定的setting/domain是固定的,针对不同的问题有不同的表达方式,所以你可以把所有常见的表达方式放在最前面,然后在处理过程中添加其他的。