-
Notifications
You must be signed in to change notification settings - Fork 76
/
analogy.pi
68 lines (52 loc) · 1.34 KB
/
analogy.pi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
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.