%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% analogy.pro Dave Reed 1/23/02 %%% %%% A program based on Evans' analogy reasoner. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(200, xfy, is_to). :- op(200, xfy, as). :- op(180, xfy, sized). analogy(Question, Solution) :- question(Question, F1 is_to F2 as F3 is_to Answers), transform(Rule, F1 is_to F2), transform(Rule, F3 is_to Solution), member(Solution, Answers). transform(invertPosition, inside(small sized Figure1, large sized Figure2) is_to inside(small sized Figure2, large sized Figure1)). transform(invertPosition, above(Size1 sized Figure1, Size2 sized Figure2) is_to above(Size2 sized Figure2, Size1 sized Figure1)). transform(invertSizes, inside(small sized Figure1, large sized Figure2) is_to inside(small sized Figure2, large sized Figure1)). transform(invertSizes, above(Size1 sized Figure1, Size2 sized Figure2) is_to above(Size2 sized Figure1, Size1 sized Figure2)). question(q1, inside(small sized square, large sized triangle) is_to inside(small sized triangle, large sized square) as inside(small sized circle, large sized square) is_to [inside(small sized circle, large sized triangle), inside(small sized square, large sized circle), inside(small sized triangle, large sized square)]). question(q2, inside(small sized circle, large sized square) is_to inside(small sized square, large sized circle) as above(small sized triangle, large sized triangle) is_to [above(small sized circle, large sized circle), inside(small sized triangle, large sized triangle), above(large sized triangle, small sized triangle)]). question(q3, above(small sized square, large sized circle) is_to above(large sized square, small sized circle) as above(small sized circle, large sized triangle) is_to [above(large sized circle, small sized triangle), inside(small sized circle, large sized triangle), above(large sized triangle, small sized square)]). question(q4, above(small sized square, large sized square) is_to above(large sized square, small sized square)as above(large sized circle, small sized triangle) is_to [above(small sized circle, large sized triangle), inside(small sized circle, large sized triangle), above(small sized triangle, large sized circle)]).