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是固定的,针对不同的问题有不同的表达方式,所以你可以把所有常见的表达方式放在最前面,然后在处理过程中添加其他的。