# 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 = KB.ask(aima.utils.expr('Hostile(x)'))
criminal = KB.ask(aima.utils.expr('Criminal(x)'))
# Print answers
print('Hostile?')
print(hostile)
print('\nCriminal?')
print(criminal)
print()
# Tell python to run main method
if __name__ == "__main__": main()
IyBJbXBvcnQgbGlicmFyaWVzCmltcG9ydCBhaW1hLnV0aWxzCmltcG9ydCBhaW1hLmxvZ2ljCiMgVGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoaXMgbW9kdWxlCmRlZiBtYWluKCk6CiAgICAjIENyZWF0ZSBhbiBhcnJheSB0byBob2xkIGNsYXVzZXMKICAgIGNsYXVzZXMgPSBbXQogICAgIyBBZGQgZmlyc3Qtb3JkZXIgbG9naWMgY2xhdXNlcyAocnVsZXMgYW5kIGZhY3QpCiAgICBjbGF1c2VzLmFwcGVuZChhaW1hLnV0aWxzLmV4cHIoIihBbWVyaWNhbih4KSAmIFdlYXBvbih5KSAmIFNlbGxzKHgsIHksIHopICYgSG9zdGlsZSh6KSkgPT0+IENyaW1pbmFsKHgpIikpCiAgICBjbGF1c2VzLmFwcGVuZChhaW1hLnV0aWxzLmV4cHIoIkVuZW15KE5vbm8sIEFtZXJpY2EpIikpCiAgICBjbGF1c2VzLmFwcGVuZChhaW1hLnV0aWxzLmV4cHIoIk93bnMoTm9ubywgTTEpIikpCiAgICBjbGF1c2VzLmFwcGVuZChhaW1hLnV0aWxzLmV4cHIoIk1pc3NpbGUoTTEpIikpCiAgICBjbGF1c2VzLmFwcGVuZChhaW1hLnV0aWxzLmV4cHIoIihNaXNzaWxlKHgpICYgT3ducyhOb25vLCB4KSkgPT0+IFNlbGxzKFdlc3QsIHgsIE5vbm8pIikpCiAgICBjbGF1c2VzLmFwcGVuZChhaW1hLnV0aWxzLmV4cHIoIkFtZXJpY2FuKFdlc3QpIikpCiAgICBjbGF1c2VzLmFwcGVuZChhaW1hLnV0aWxzLmV4cHIoIk1pc3NpbGUoeCkgPT0+IFdlYXBvbih4KSIpKQogICAgIyBDcmVhdGUgYSBmaXJzdC1vcmRlciBsb2dpYyBrbm93bGVkZ2UgYmFzZSAoS0IpIHdpdGggY2xhdXNlcwogICAgS0IgPSBhaW1hLmxvZ2ljLkZvbEtCKGNsYXVzZXMpCiAgICAjIEFkZCBydWxlcyBhbmQgZmFjdHMgd2l0aCB0ZWxsCiAgICBLQi50ZWxsKGFpbWEudXRpbHMuZXhwcignRW5lbXkoQ29jbywgQW1lcmljYSknKSkKICAgIEtCLnRlbGwoYWltYS51dGlscy5leHByKCdFbmVteShKb2pvLCBBbWVyaWNhKScpKQogICAgS0IudGVsbChhaW1hLnV0aWxzLmV4cHIoIkVuZW15KHgsIEFtZXJpY2EpID09PiBIb3N0aWxlKHgpIikpCiAgICAjIEdldCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBrbm93bGVkZ2UgYmFzZSB3aXRoIGFzawogICAgaG9zdGlsZSA9IEtCLmFzayhhaW1hLnV0aWxzLmV4cHIoJ0hvc3RpbGUoeCknKSkKICAgIGNyaW1pbmFsID0gS0IuYXNrKGFpbWEudXRpbHMuZXhwcignQ3JpbWluYWwoeCknKSkKICAgICMgUHJpbnQgYW5zd2VycwogICAgcHJpbnQoJ0hvc3RpbGU/JykKICAgIHByaW50KGhvc3RpbGUpCiAgICBwcmludCgnXG5DcmltaW5hbD8nKQogICAgcHJpbnQoY3JpbWluYWwpCiAgICBwcmludCgpCiMgVGVsbCBweXRob24gdG8gcnVuIG1haW4gbWV0aG9kCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6IG1haW4oKQ==