Startpunkten
This commit is contained in:
150
Prolog_Intro/lab1.pl
Normal file
150
Prolog_Intro/lab1.pl
Normal file
@@ -0,0 +1,150 @@
|
||||
/*****************************/
|
||||
/* 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).
|
||||
Reference in New Issue
Block a user