% Figure 19.12 Learning the concept of arch. :- op( 900, fy, not). % not Goal): negation as failure; % Note: This is often available as a built-in predicate, % often written as prefix operator "\+", e.g. \+ likes(mary,snakes) not Goal :- Goal, !, fail ; true. % Learning about arch backliteral( isa(X,Y), [X:object], []) :- member( Y, [polygon,convex_poly,stable_poly,unstable_poly,triangle, rectangle, trapezium, unstable_triangle, hexagon]). % Y is any figure backliteral( support(X,Y), [X:object, Y:object], []). backliteral( touch(X,Y), [X:object, Y:object], []). backliteral( not G, [X:object,Y:object], []) :- G = touch(X,Y); G = support(X,Y). prolog_predicate( isa(X,Y)). prolog_predicate( support(X,Y)). prolog_predicate( touch(X,Y)). prolog_predicate( not G). ako( polygon, convex_poly). % Convex polygon is a kind of polygon ako( convex_poly, stable_poly). % Stable polygon is a kind of convex polygon ako( convex_poly, unstable_poly). % Unstable polygon is a kind of convex poly. ako( stable_poly, triangle). % Triangle is a kind of stable polygon ako( stable_poly, rectangle). % Rectangle is a kind of stable polygon ako( stable_poly, trapezium). % Trapezium is a kind of stable polygon ako( unstable_poly, unstable_triangle). % Unstable triangle is a.k.o. unstable poly. ako( unstable_poly, hexagon). % Hexagon is a kind of unstable polygon ako( rectangle, X) :- member( X, [a1,a2,a3,a4,a5,b1,b2,b3,b4,b5,c1,c2,c3]). % All rectangles ako( triangle, c4). % Stable triangle ako( unstable_triangle, c5). % Triangle upside down isa( Figure1, Figure2) :- % Figure1 is a Figure2 ako( Figure2, Figure1). isa( Fig0, Fig) :- ako( Fig1, Fig0), isa( Fig1, Fig). support(a1,c1). support(b1,c1). support(a3,c3). support(b3,c3). touch(a3,b3). support(a4,c4). support(b4,c4). support(a5,c5). support(b5,c5). start_clause( [ arch(X,Y,Z)] / [X:object,Y:object,Z:object]). ex( arch(a1,b1,c1)). ex( arch(a4,b4,c4)). nex( arch(a2,b2,c2)). nex( arch(a3,b3,c3)). nex( arch(a5,b5,c5)). nex( arch(a1,b2,c1)). nex( arch(a2,b1,c1)).