Files
Logik/Prolog_Intro/lab1.pl
2026-03-05 13:42:07 +01:00

151 lines
4.0 KiB
Prolog

/*****************************/
/* 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).