/* Analogy in Picat. Evans' Analogy program. This Picat version is based on the Prolog code from Leon S. Sterling: "The Art of Prolog", page 270ff This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. % import cp. main => go. go ?=> test_analogy(Name,X), writeln([Name,X]), nl, fail. go => true. analogy(AB,CX,Answers) => AB = $is_to(A, B), CX = $is_to(C,X), match(A,B,Match), match(C,X,Match), member(X,Answers). test_analogy(Name,X) => figures(Name,A,B,C), answers(Name,Answers), analogy($is_to(A, B),$is_to(C, X),Answers). % The problem: % A is to B as C is to ? figures(Name,A,B,C) => Name = test1, A = $inside(square,triangle), B = $inside(triangle,square), C = $inside(circle,square). % % The three possible answers % See Figure 14.5, page 271 in "The Art of Prolog" % answers(Name,Answers) => Name = test1, Answers = [$inside(circle,triangle), % Answer 1 $inside(square,circle), % Answer 2 $inside(triangle,square) % Answer 3 ]. match(A,B,Match) ?=> A = $inside(Figure1,Figure2), B = $inside(Figure2,Figure1), Match = invert. match(A,B,Match) => A = $above(Figure1,Figure2), B = $above(Figure2,Figure1), Match = invert.