require 'test/unit' begin require 'logicagent' rescue LoadError require_relative 'logicagent' end BasicSocket.do_not_reverse_lookup = true class TestGAgent < Test::Unit::TestCase def setup @agent = MyAgent.new @agent.send("reset graph") @agent.send("set save mode off") end # transitivity: a = b, b = c, therefore a = c def test_0 actual = @agent.send("a = b")[0] assert_match(/Okay/, actual) actual = @agent.send("b = c")[0] assert_match(/Okay/, actual) actual = @agent.send("does a = c?")[0] assert_match(/Yes/, actual) actual = @agent.send("why does a = c?")[0] assert_match(/because: a = b, and b = c/, actual) end # transitivity: socrates is a man, all men are mortal, is Socrates mortal? def test_1 actual = @agent.send("Socrates is a man.")[0] assert_match(/Okay/, actual) actual = @agent.send("a man is all men.")[0] assert_match(/Okay/, actual) actual = @agent.send("all men are mortal.")[0] assert_match(/Okay/, actual) actual = @agent.send("is Socrates mortal?")[0] assert_match(/Yes/, actual) actual = @agent.send("why is Socrates mortal?")[0] assert_match(/because: socrates is a man, and a man is all men, and all men are mortal/, actual) end # is Mercury solid? Mercury is not solid. def test_2 actual = @agent.send("All metals are solid.")[0] assert_match(/^Okay/, actual) actual = @agent.send("Mercury is a metal.")[0] assert_match(/^Okay/, actual) actual = @agent.send("a metal is all metals.")[0] assert_match(/^Okay/, actual) actual = @agent.send("is MErcury solid?")[0] assert_match(/^Yes/, actual) actual = @agent.send("Why is Mercury solid?")[0] assert_match(/because: mercury is a metal, and a metal is all metals, and all metals are solid/, actual) actual = @agent.send("Mercury is not solid.")[0] #assert_match(/contradicts/, actual) assert_match(/Okay/i, actual) actual = @agent.send("remove edge all metals are solid")[0] assert_match(/^Okay/, actual) actual = @agent.send("what is MErcury?")[0] assert_match(/mercury is a metal/i, actual) assert_match(/[^(all metals)]/, actual) actual = @agent.send("is Mercury solid?")[0] #assert_match(/no knowledge/, actual) assert_match(/No/, actual) end # save, load, reset def test_3 actual = @agent.send("print graph")[0] assert_match(/empty/, actual) actual = @agent.send("a = b")[0] assert_match(/Okay/, actual) actual = @agent.send("save graph test.graph")[0] assert_match(/saved/, actual) actual = @agent.send("reset graph")[0] assert_match(/Okay/, actual) actual = @agent.send("y = z")[0] assert_match(/Okay/, actual) actual = @agent.send("print graph")[0] assert_match(/y = z/, actual) actual = @agent.send("load graph test.graph")[0] actual = @agent.send("print graph")[0] assert_match(/a = b/, actual) File.delete("test.graph") end # save mode def test_3b actual, s = @agent.send("what is the save mode?") assert_match(/\boff\b/, actual) actual, s = @agent.send("set save mode on") actual, s = @agent.send("what is the save mode?") assert_match(/\bon\b/, actual) end # reflexivity and symmetry: if a = b, a = a, b = b, and b = a def test_4 actual = @agent.send("a = b")[0] assert_match(/Okay/, actual) actual = @agent.send("does a = a?")[0] assert_match(/Yes/, actual) actual = @agent.send("does b = b?")[0] assert_match(/Yes/, actual) actual = @agent.send("does a = b?")[0] assert_match(/Yes/, actual) actual = @agent.send("does b = a?")[0] assert_match(/Yes/, actual) end # multiple edges between vertices def test_5 actual = @agent.send("birds are avians")[0] assert_match(/Okay/, actual) actual = @agent.send("birds = avians")[0] assert_match(/Okay/, actual) actual = @agent.send("are avians birds?")[0] #assert_match(/ no /, actual) actual = @agent.send("do avians = birds?")[0] assert_match(/Yes/, actual) end # Do ostriches have wings? def test_6 actual = @agent.send("All birds have wings.")[0] assert_match(/Okay/, actual) actual = @agent.send("Ostriches are birds.")[0] assert_match(/Okay/, actual) actual = @agent.send("birds are all birds")[0] assert_match(/Okay/, actual) actual = @agent.send("Do ostriches have wings?")[0] assert_match(/Yes/, actual) actual = @agent.send("Friends have enemies.")[0] assert_match(/Okay/, actual) actual = @agent.send("John is a friend.")[0] assert_match(/Okay/, actual) actual = @agent.send("a friend is friends")[0] assert_match(/Okay/, actual) actual = @agent.send("Does John have enemies?")[0] assert_match(/Yes/, actual) end # Can all kings make mistakes? def test_7 @agent.send("All men may make mistakes.")[0] @agent.send("All kings are men.")[0] @agent.send("men are all men")[0] actual = @agent.send("Can all kings make mistakes?")[0] assert_match(/Yes/, actual) end # Each person has two hands; a person is each person; what does a person have? def test_8 @agent.send("Each person has two hands.")[0] @agent.send("a person is each person")[0] actual = @agent.send("What does each person have?")[0] expected = /two hands/ assert_match(expected, actual) actual = @agent.send("What does a person have?")[0] assert_match(expected, actual) end # First few lines (without the counting part) of raphael_dialog.txt def test_9 @agent.send("Every boy is a person.") @agent.send("A finger is part of a hand.") @agent.send("Each person has two hands.") actual = @agent.send("Does John have fingers?")[0] assert_match(/( no | nothing )/, actual) @agent.send("John is a boy.") @agent.send("a boy is every boy") @agent.send("a finger is fingers") @agent.send("a person is each person") @agent.send("two hands is a hand") actual = @agent.send("Does John have fingers?")[0] assert_match(/Yes/, actual) end # remove edge ___ has ___ def test_10 @agent.send("i have a cat") actual = @agent.send("remove 'i have a cat'")[0] assert_match(/Okay I have forgotten/, actual) actual = @agent.send("print graph")[0] assert_match(/The graph is empty./, actual) end # why does ___ have ___? def test_11 @agent.send("I have a cat.") @agent.send("Cats have tails.") @agent.send("a cat is cats") @agent.send("tails is a tail") @agent.send("I is plural") @agent.send("i is plural") actual = @agent.send("Do I have a tail?")[0] assert_match(/Yes/, actual) actual = @agent.send("Why do I have a tail?")[0] expected = /because: i have a cat, and a cat is cats, and cats have tails, and tails are a tail/ assert_match(expected, actual) end # a is a; what is a? is a a? def test_12 @agent.send("a is a") actual = @agent.send("what is a?")[0] expected = "a is a" assert_equal(expected, actual) actual = @agent.send("is a a?")[0] assert_match(/Yes/, actual) end # a is a; why is a a? def test_13 @agent.send("a is a") actual = @agent.send("why is a a?")[0] expected = /because/i assert_match(expected, actual) actual = @agent.send("is a a?")[0] assert_match(/Yes/, actual) end # a is b; is b b? why is b b? def test_14 @agent.send("a is b") actual = @agent.send("is b b?")[0] assert_match(/Yes/, actual) actual = @agent.send("why is b b?")[0] assert_match(/because/i, actual) end # a = b; does a == b? etc. def test_15 actual = @agent.send('a = b')[0] expected = /Okay, a = b./ assert_match(expected, actual) actual = @agent.send('is a == b?')[0] expected = /Yes, a = b./ assert_match(expected, actual) actual = @agent.send('does a == b?')[0] expected = /Yes, a = b./ assert_match(expected, actual) actual = @agent.send('is a = b?')[0] expected = /Yes, a = b./ assert_match(expected, actual) actual = @agent.send('does a = b?')[0] expected = /Yes, a = b./ assert_match(expected, actual) actual = @agent.send('ostriches = avians')[0] expected = /Okay, ostriches = avians./ assert_match(expected, actual) actual = @agent.send('do ostriches = avians?')[0] expected = /Yes, ostriches = avians./ assert_match(expected, actual) actual = @agent.send('are avians == ostriches?')[0] expected = /Yes, avians = ostriches./ assert_match(expected, actual) end # why is ___ ___? (___ not in graph) def test_16 expected = /no knowledge/ actual = @agent.send("why is Socrates mortal?") assert_match(expected, actual.to_s) @agent.send("Socrates is mortal") actual = @agent.send("why is mortal human?") assert_match(expected, actual.to_s) actual = @agent.send("why does a == b?") assert_match(expected, actual.to_s) actual = @agent.send("why do birds have wings?") assert_match(expected, actual.to_s) end # ___ means ___, ___ means the same as ___, ___ is the same as ___ def test_17 expected = /Okay/ actual = @agent.send("man means a two-footed animal") assert_match(expected, actual.to_s) @agent.send("Socrates is a man") actual = @agent.send("a man means the same as man") assert_match(expected, actual.to_s) actual = @agent.send("is Socrates a two-footed animal?") assert_match(/yes/i, actual.to_s) actual = @agent.send("not being a man is the same as being a man") assert_match(/Okay/, actual.to_s) end # is "___" "___"? is ___ the same as ___? does ___ mean (the same as) ___? # why is "___" "___"? why is ___ the same as ___? why does ___ mean ___? def test_18 @agent.send('"being a man" means "not being a man"') actual = @agent.send('what does "being a man" mean?') assert_match(/not being a man/, actual.to_s) actual = @agent.send("is \"being a man\" \"not being a man\"?") assert_match(/Yes/, actual.to_s) actual = @agent.send("is \"being a man\" the same as \"not being a man\"?") assert_match(/Yes/, actual.to_s) actual = @agent.send("is being a man the same as not being a man?") assert_match(/Yes/, actual.to_s) actual = @agent.send("does \"being a man\" mean \"not being a man\"?") assert_match(/Yes/, actual.to_s) actual = @agent.send('why is "being a man" "not being a man"?') assert_match(/because/, actual.to_s) actual = @agent.send("why is being a man the same thing as not being a man?") assert_match(/because/, actual.to_s) actual = @agent.send('why does "being a man" mean "not being a man"?') assert_match(/because/, actual.to_s) end # The "mercury" dialog from the documentation. def test_19 actual = @agent.send('All metals are solid.') expected = /Okay, All metals are solid./ assert_match(expected, actual.to_s) actual = @agent.send('Mercury is a metal.') expected = /Okay, Mercury is a metal./ assert_match(expected, actual.to_s) actual = @agent.send('a metal is all metals') expected = /Okay, a metal is all metals./ assert_match(expected, actual.to_s) actual = @agent.send('is Mercury solid?') expected = /Yes, Mercury is solid./ assert_match(expected, actual.to_s) actual, score = @agent.send('Mercury is not solid') expected = /That contradicts the information I have that Mercury is solid because: mercury is a metal, and a metal is all metals, and all metals are solid./ #assert_match(expected, actual.to_s) assert_match(/Okay/i, actual) actual = @agent.send('forget "all metals are solid."') expected = /Okay I have forgotten all metals are solid./ assert_match(expected, actual.to_s) actual = @agent.send('is Mercury solid?') expected = /I have no knowledge that Mercury is solid./ #assert_match(expected, actual.to_s) assert_match(/No/, actual.to_s) end # names def test_20 actual, s = @agent.send("joe is a name") assert_match(/Okay\b/, actual) actual, s = @agent.send("joe: a is b") assert_match(/Okay\b/, actual) actual, s = @agent.send("what is a?") assert_match(/\bb\b/, actual) actual, s = @agent.send("what are the names?") assert_match(/\bjoe\b/, actual) actual, s = @agent.send("joe is not a name") assert_match(/Okay/, actual) actual, s = @agent.send("what are the names?") assert_match(//, actual) end # read file def test_21 actual, s = @agent.send("read highest.txt") assert_match(/Okay/, actual) actual, s = @agent.send("what is something you find at the beach?") assert_match(/sand/, actual) #actual, s = @agent.send("read openmind\\assertions-1-1") #assert_match(/Okay/, actual) actual, s = @agent.send("reset graph") #actual, s = @agent.send("read openmind/highest.txt") actual, s = @agent.send("read highest.txt") assert_match(/Okay/, actual) actual, s = @agent.send("how many facts?") assert_match(/164/, actual) actual, s = @agent.send("what was the last file read") assert_match(/highest.txt/, actual) end # birds flying def test_22 actual, s = @agent.send("a bird can fly") actual, s = @agent.send("can a bird fly?") assert_match(/Yes/, actual) actual, s = @agent.send("planes fly") actual, s = @agent.send("can planes fly?") assert_match(/Yes/, actual) end # is "A recommends gold" true? def test_23 actual, s = @agent.send("A recommends gold") actual, s = @agent.send("B recommends gold") actual, s = @agent.send("Does A recommend Gold?") assert_match(/Yes/, actual) actual, s = @agent.send("is \"B recommends gold\" true?") ###assert_match(/Yes/, actual) actual, s = @agent.send("is \"A recommends gold\" true?") ###assert_match(/Yes/, actual) end # X eats Y, does X eat Y?, why does X eat Y def test_24 actual, s = @agent.send("bears eat fish") actual, s = @agent.send("bears eat foxes") actual, s = @agent.send("deers eat grass") actual, s = @agent.send("deer eat grass") actual, s = @agent.send("a deer eats grass") actual, s = @agent.send("a bear is an animal") actual, s = @agent.send("a fish is an animal") actual, s = @agent.send("a fox is an animal") actual, s = @agent.send("a deer is an animal") actual, s = @agent.send("grass is a plant") # Ex. 37 from Section 1.5 of "Mathematical Structures for Computer Science" actual, s = @agent.send("is a bear an animal?") assert_match(/Yes/i, actual) actual, s = @agent.send("does a deer eat grass?") assert_match(/Yes/i, actual) actual, s = @agent.send("do deer eat grass?") assert_match(/Yes/i, actual) actual, s = @agent.send("does a bear eat a rabbit?") assert_match(/no knowledge/i, actual) # Ex. 38 actual, s = @agent.send("what do bears eat?") assert_match(/fish.*fox/im, actual) actual, s = @agent.send("what does a bear eat?") assert_match(/don't know/, actual) #actual, s = @agent.send("a bear is bears") actual, s = @agent.send("a bear eats fish") actual, s = @agent.send("a bear eats foxes") actual, s = @agent.send("what does a bear eat?") assert_match(/fish.*fox/im, actual) actual, s = @agent.send("what eats grass?") assert_match(/deer/i, actual) actual, s = @agent.send("cows eat grass") actual, s = @agent.send("what eats grass?") assert_match(/deer.*cows/im, actual) actual, s = @agent.send("a plant is grass") actual, s = @agent.send("plants are a plant") actual, s = @agent.send("what eats plants?") assert_match(/deer/i, actual) actual, s = @agent.send("x is a prey if it is an animal that is eaten.") actual, s = @agent.send("which animals are prey?") #assert_match(/fish.*fox/im, actual) end # Question from the national teachers' examination, given in 1992 # by the Educational Testing Service, cited in "Logic Made Easy", # by Deborah Bennett, page 17. def test_25 actual, s = @agent.send("All education majors student teach.") assert_match(/Okay/, actual) actual, s = @agent.send("Some education majors have double majors.") assert_match(/Okay/, actual) actual, s = @agent.send("Some mathematics students are education majors.") assert_match(/Okay/, actual) actual, s = @agent.send("Do some of those with double majors student teach?") assert_match(/no knowledge/, actual) actual, s = @agent.send("double majors is had by some education majors") assert_match(/Okay/, actual) actual, s = @agent.send("some education majors are all education majors") assert_match(/Okay/, actual) actual, s = @agent.send("some of those with double majors is double majors") assert_match(/Okay/, actual) actual, s = @agent.send("Do some of those with double majors student teach?") assert_match(/Yes/, actual) actual, s = @agent.send("Why do some of those with double majors student teach?") assert_match(/because.*are.*are had by.*are.*student teach/m, actual) end # Lunar system example (Intro. to Art. Int., Charniak and McDermott, p.2) def test_lunar actual, s = @agent.send("s10020 contains chromite") actual, s = @agent.send("s10045 contains chromite") actual, s = @agent.send("s10084 contains chromite") actual, s = @agent.send("what contains chromite?") assert_match(/s10020/, actual) assert_match(/s10045/, actual) assert_match(/s10084/, actual) actual, s = @agent.send("How many samples contain chromite?") assert_match(/3/, actual) actual, s = @agent.send("What are those samples?") assert_match(/s10020/, actual) assert_match(/s10045/, actual) assert_match(/s10084/, actual) end def test_link actual, s = @agent.send("yahoo is http://yahoo.com") actual, s = @agent.send("what is yahoo?") assert_match(/http\:\/\//, actual) actual, s = @agent.send("west end blues is http://www.youtube.com/watch?v=f5Hbh_-IRs8") actual, s = @agent.send("what is west end blues?") assert_match(/#{Regexp.escape("http://www.youtube.com/watch?v=f5Hbh_-IRs8")}/, actual) end def test_when_was actual, s = @agent.send("the pliocene was from 2-10 million years ago.") actual, s = @agent.send("when was the pliocene?") assert_match(/2-10 million years ago/, actual) actual, s = @agent.send("the blah was x years ago.") actual, s = @agent.send("the blah == the blah period") actual, s = @agent.send("when was the blah period?") assert_match(/is x years ago/, actual) end def test_funnier_than actual, s = @agent.send("seinfeld is funnier than frasier") actual, s = @agent.send("frasier is funnier than charlie sheen") actual, s = @agent.send("charlie sheen = sheen") actual, s = @agent.send("is seinfeld funnier than sheen?") assert_match(/yes/i, actual) actual, s = @agent.send("why is seinfeld funnier than charlie sheen?") assert_match(/because/, actual) end def test_greater_than actual, s = @agent.send("10 > 1") assert_match(/true|yes/i, actual) actual, s = @agent.send("is 10 > 4?") assert_match(/true|yes/i, actual) actual, s = @agent.send("is 10 greater than 5?") assert_match(/no|false/i, actual) actual, s = @agent.send("\"is greater than\" == \">\"") actual, s = @agent.send("is 10 greater than 5?") assert_match(/true|yes/i, actual) actual, s = @agent.send("is 100 greater than 1001?") assert_match(/false|no/i, actual) actual, s = @agent.send("which is greater, 25 or 37?") assert_match(/37 is greater/i, actual) end def test_is actual, s = @agent.send("Polaris is true north") actual, s = @agent.send("is Polaris true north?") assert_match(/Yes/i, actual) end def test_smaller_than actual, s = @agent.send("an ant is smaller than Rigel") actual, s = @agent.send("Rigel is a star") actual, s = @agent.send("is an ant smaller than a star?") assert_match(/Yes/i, actual) actual, s = @agent.send("why is an ant smaller than a star?") assert_match(/rigel is a star/i, actual) actual, s = @agent.send("is an ant bigger than Rigel?") assert_match(/no knowledge/i, actual) actual, s = @agent.send("is an ant bigger than a star?") assert_match(/no knowledge/i, actual) end def test_taller_than actual, s = @agent.send("mark is taller than john") actual, s = @agent.send("john is taller than bill") actual, s = @agent.send("is mark taller than bill?") assert_match(/Yes/i, actual) actual, s = @agent.send("bill is a midget") actual, s = @agent.send("is mark taller than a midget?") assert_match(/Yes/i, actual) actual, s = @agent.send("why is Mark taller than a midget?") assert_match(/bill is a midget/i, actual) end def test_mammal actual, s = @agent.send("is a man bigger than a car?") assert_match(/no knowledge/, actual) actual, s = @agent.send("a man is smaller than a car") actual, s = @agent.send("is a man smaller than a car?") assert_match(/Yes/i, actual) actual, s = @agent.send("a man = a mammal") actual, s = @agent.send("is a mammal smaller than a car?") assert_match(/Yes/i, actual) actual, s = @agent.send("why is a mammal smaller than a car?") assert_match(/a mammal = a man/i, actual) actual, s = @agent.send("a whale = a mammal") actual, s = @agent.send("is a whale smaller than a car?") assert_match(/Yes/i, actual) actual, s = @agent.send("a whale is not smaller than a car") actual, s = @agent.send("is a whale smaller than a car?") assert_match(/No/i, actual) actual, s = @agent.send("a whale is bigger than a car") actual, s = @agent.send("is a mammal bigger than a car?") assert_match(/Yes/i, actual) actual, s = @agent.send("is a man bigger than a whale?") assert_match(/Yes/i, actual) actual, s = @agent.send("a man is not bigger than a whale") actual, s = @agent.send("is a man bigger than a whale?") assert_match(/No/i, actual) end def test_preorder_and_equivalence actual, s = @agent.send("John is a bachelor") actual, s = @agent.send("the pope is a bachelor") actual, s = @agent.send("is John the pope?") assert_match(/no knowledge/, actual) actual, s = @agent.send("the pope = a bachelor") actual, s = @agent.send("is John the pope?") assert_match(/Yes/, actual) actual, s = @agent.send("forget that the pope = a bachelor") actual, s = @agent.send("is John the pope?") assert_match(/no knowledge/, actual) end def test_three_inputs_on_one_line actual, s = @agent.send("John is taller than Mary and Mary is taller than Sue. Who is taller, Sue or John?") assert_match(/John is taller/i, actual) actual, s = @agent.send("Who is shorter, John or Sue?") end def test_opposites actual, s = @agent.send("\"is bigger than\" is the opposite of \"is smaller than\"") actual, s = @agent.send("A pine tree is bigger than a beach ball") actual, s = @agent.send("A beach ball is bigger than a pineapple.") actual, s = @agent.send("Which is smaller, a pine tree or a pineapple?") assert_match(/pineapple/i, actual) end def test_X_wrote_Y actual, s = @agent.send("John wrote books.") actual, s = @agent.send("did John write books?") assert_match(/no knowledge/i, actual) actual, s = @agent.send("write = wrote") actual, s = @agent.send("did John write books?") #assert_match(/Yes, John is write books/i, actual) assert_match(/Yes, John write books/i, actual) #actual, s = @agent.send("logicbot: if response =~ /is write/ then response.sub!(/is write/, 'wrote') end") #actual, s = @agent.send("Did John write books?") # needs logicbot for rules #assert_match(/Yes, John wrote books/i, actual) actual, s = @agent.send("What did John write?") assert_match(/John write books/i, actual) actual, s = @agent.send("wrote is the past tense of write") actual, s = @agent.send("What did John write?") assert_match(/John wrote books/i, actual) end def test_is_Pat_older_than_Quincy actual, s = @agent.send("The father of Quincy is Pat.") actual, s = @agent.send("Fathers are older than their children.") actual, s = @agent.send("fathers includes the father of Quincy.") actual, s = @agent.send("their children includes Quincy.") actual, s = @agent.send("does their children include Quincy?") #if actual !~ /Yes/i then actual, s = @agent.send("include = includes") end #actual, s = @agent.send("does their children include Quincy?") assert_match(/Yes/i, actual) actual, s = @agent.send("is Pat older than Quincy?") if actual !~ /Yes/i then actual, s = @agent.send("Pat is the father of Quincy.") end actual, s = @agent.send("is Pat older than Quincy?") assert_match(/Yes/i, actual) end def test_is_X_a_parent_of_Y # have to test rules in testlogicbot.rb #actual, s = @agent.send("logicbot: if input =~ /(.*) (is a parent of) (.*)/ then self.send(\"\#{$1} is an ancestor of \#{$3}\") end") actual, s = @agent.send("John is a parent of Joe.") actual, s = @agent.send("Joe is a parent of Sue.") actual, s = @agent.send("is John a parent of Sue?") assert_match(/no knowledge/i, actual) actual, s = @agent.send("Jack = John") actual, s = @agent.send("is Jack a parent of Joe?") assert_match(/Yes/i, actual) actual, s = @agent.send("why is Joe a parent of Susan?") assert_match(/no knowledge/i, actual) actual, s = @agent.send("Susan = Sue") actual, s = @agent.send("why is Joe a parent of Susan?") assert_match(/because/i, actual) end # 2/3/2015 def test_X_is_a_man_who_whistles actual, s = @agent.send("John whistles.") actual, s = @agent.send("John is a man.") actual, s = @agent.send("Is John a man who whistles?") assert_match(/^Yes/i, actual) actual, s = @agent.send("What are John's relations?") assert_match(/is a man *who whistles/i, actual) actual, s = @agent.send("Every man who whistles is happy.") actual, s = @agent.send("Is John a man who whistles?") assert_match(/^Yes/i, actual) actual, s = @agent.send("Every man who whistles = a man who whistles") actual, s = @agent.send("Is John happy?") assert_match(/^Yes/i, actual) end end # class