/*****************************/ /* Christian Ohlsson */ /* Logik för dataloger */ /* Karlstad 990228 */ /* Lab 1 i Logik */ /*****************************/ /* Functions included: */ /* smaller_than_all */ /* exchange_all */ /* exchange_nth */ /* subset */ /* member */ /*****************************/ /* sum */ /* product */ /* fac */ /*****************************/ /* diff */ /* ismother */ /* isfather */ /* isson */ /* sisterof */ /* grandpaof */ /* sibling */ /*****************************/ /****************************************************** smaller_than_all (M, [array of numbers]). Kollar om M är mindre än alla tal i arrayen och om så är fallet svarar kompilatorn med Yes */ smaller_than_all(M,[]). smaller_than_all(M,[Y|L]) :- M < Y, smaller_than_all(M, L). /****************************************************** exchange_all(E1,E2,[indata-array],[utdata-array]) Byter ut alla E1 mot E2 i indata-arrayen och lagrar detta i utdata-arrayen */ exchange_all(E1,E2,[],[]). exchange_all(E1,E2,[Y|L], [F|R]):-E1 = Y, F is E2,exchange_all(E1,E2,L,R). exchange_all(E1,E2,[Y|L], [Y|R]):-exchange_all(E1,E2,L,R). /****************************************************** exchange_nth(E1,E2,[indata-array],[utdata-array]) Byter ut elementet på plats E1 mot E2 */ exchange_nth(E1,E2,[],[]). exchange_nth(E1,E2,[Y|L],[F|R]):-E1 = 1,F is E2, exchange_nth(0,E2,L,R). exchange_nth(E1,E2,[Y|L], [Y|R]):-W is E1-1,exchange_nth(W,E2,L,R). /****************************************************** subset([array1], [array2]) Kollar om alla element i array1 finns med i array2 och returnerar då Yes. */ subset([], L). subset([Y|L], R):- member(Y, R),subset(L,R). member(X,[X|_]). member(X,[_|Y]):-member(X,Y). /****************************************************** sum Tar emot tre värden och svarar Yes om det tredje värdet är summan av de två tidigare. product Tar emot tre värden och svarar Yes om det tredje värdet är produkten av de två tidigare. fac Tar emot två värden och svarar Yes om det andra värdet är faculteten av det första. */ sum(N, N1, S) :- S is N + N1. product(N1, N2, S) :- S is N1 * N2. fac(1,1). fac(N, S) :- M is N-1, fac(M, Z), S is N * Z. /****************************************************** Familjen */ /* Män */ male(martin). male(olle). male(pelle). male(peter). male(stefan). male(tadek). male(sven). /* Kvinnor */ female(anna). female(claudia). female(edyta). female(terry). female(berit). female(halina). /* parents(X, Y, Z) = Z, Y föräldrar till X */ parents(anna, berit, stefan). parents(martin, berit, stefan). parents(edyta, halina, tadek). parents(peter, halina, tadek). /* father(X, Y) = X är far till Y */ father(stefan, anna). father(sven, tadek). father(stefan, martin). father(tadek, edyta). father(tadek, peter). /* mother(X, Y) = X är mor till Y */ mother(berit, anna). mother(berit, martin). mother(halina, edyta). mother(halina, peter). /* parent(X, Y) = X är förälder till Y */ parent(berit, anna). parent(berit, martin). parent(stefan, anna). parent(stefan, martin). parent(halina, edyta). parent(halina, peter). parent(tadek, edyta). parent(tadek, peter). /* diff(X, Y) = X är inte densamma som Y */ diff(X, Y) :- X \= Y. /* ismother(X) = X är en mor */ ismother(X) :- parents(_, X, _), female(X). /* isfather(X) = X är en far */ isfather(X) :- parents(_, _, X), male(X). /* isson(X) = X är en son */ isson(X) :- parents(X, _, _), male(X). /* sisterof(X, Y) = X är syster till Y */ sisterof(X, Y) :- female(X), parents(X,_,_), parents(Y,_,_), diff(X, Y). /* grandpaof(X, Y) = X är grandpa till Y */ grandpaof(X, Y) :- male(X), father(X, FF), parents(Y, _, FF). /* sibling(X, Y) = X och Y är syskon */ sibling(X, Y) :- parents(X, _, F), parents(Y, _, F), diff(X, Y).