/* Learning rules for correct chess moves */ /* move(king,a,1,a,2) means move from pos(a,1) to pos(a,2) */ /* Negative examples are used to allow anonymous head variables */ background([fdiff/3,rdiff/3]). propositional([knight,bishop,rook,queen,king,d(1),d(2)]). /* Complete lambda model for move(king,a,1,a,2) */ move(king,a,1,a,2). move(king,a,3,a,2). /* Complete lambda model for move(king,a,1,b,1) */ move(king,a,1,b,1). move(king,c,1,b,1). /* Complete lambda model for move(king,a,1,b,2) */ move(king,a,1,b,2). move(king,a,3,b,2). move(king,c,1,b,2). move(king,c,3,b,2). /* Complete lambda model for move(knight,c,4,b,6) */ move(knight,c,4,b,6). move(knight,c,4,b,2). move(knight,c,4,d,2). move(knight,c,4,d,6). move(knight,a,4,b,6). move(knight,a,8,b,6). move(knight,c,8,b,6). /* Complete lambda model for move(knight,f,1,h,2) */ move(knight,f,1,h,2). move(knight,f,1,d,2). move(knight,f,3,h,2). /* Complete lambda model for move(bishop,c,4,f,7) */ move(bishop,c,4,f,7). move(bishop,c,4,f,1). move(rook,b,2,e,2). move(rook,b,2,b,3). /* Negative example to specify don't care arguments */ neg(move(rook,b,2,e,3)). move(queen,f,1,c,4). move(queen,f,7,c,4). move(queen,b,2,e,2). move(queen,a,4,a,5). /* Negative examples to specify don't care arguments */ neg(move(queen,b,2,e,3)). neg(move(queen,a,4,d,5)). /* Background knowledge */ rdiff(Rank1,Rank2,d(Diff)) :- rank(Rank1), rank(Rank2), Diff1 is Rank1-Rank2, abs(Diff1,Diff), Diff < 4. fdiff(File1,File2,d(Diff)) :- file(File1), file(File2), project(File1,Rank1), project(File2,Rank2), Diff1 is Rank1-Rank2, abs(Diff1,Diff), Diff < 4. abs(X,X) :- X>=0. abs(X,Y) :- X<0, Y is -X. file(a). file(b). file(c). file(d). file(e). file(f). file(g). file(h). rank(1). rank(2). rank(3). rank(4). rank(5). rank(6). rank(7). rank(8). project(a,1). project(b,2). project(c,3). project(d,4). project(e,5). project(f,6). project(g,7). project(h,8).