From 000d77e81a59f654b58a73747865f8d5eb12efdd Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Fri, 15 Mar 2019 19:23:42 -0700 Subject: [PATCH] Add homework 6 solutions --- fedorind.pl | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 fedorind.pl diff --git a/fedorind.pl b/fedorind.pl new file mode 100644 index 0000000..59ae999 --- /dev/null +++ b/fedorind.pl @@ -0,0 +1,119 @@ +% Here are a bunch of facts describing the Simpson's family tree. +% Don't change them! + +female(mona). +female(jackie). +female(marge). +female(patty). +female(selma). +female(lisa). +female(maggie). +female(ling). + +male(abe). +male(clancy). +male(herb). +male(homer). +male(bart). + +married_(abe,mona). +married_(clancy,jackie). +married_(homer,marge). + +married(X,Y) :- married_(X,Y). +married(X,Y) :- married_(Y,X). + +parent(abe,herb). +parent(abe,homer). +parent(mona,homer). + +parent(clancy,marge). +parent(jackie,marge). +parent(clancy,patty). +parent(jackie,patty). +parent(clancy,selma). +parent(jackie,selma). + +parent(homer,bart). +parent(marge,bart). +parent(homer,lisa). +parent(marge,lisa). +parent(homer,maggie). +parent(marge,maggie). + +parent(selma,ling). + + + +%% +% Part 1. Family relations +%% + +% 1. Define a predicate `child/2` that inverts the parent relationship. +child(X, Y) :- parent(Y, X). + +% 2. Define two predicates `isMother/1` and `isFather/1`. +isMother(X) :- female(X), parent(X, _). +isFather(X) :- male(X), parent(X, _). + +% 3. Define a predicate `grandparent/2`. +grandparent(X, Y) :- parent(X, Z), parent(Z, Y). + +% 4. Define a predicate `sibling/2`. Siblings share at least one parent. +sibling(X, Y) :- parent(Z, X), parent(Z, Y), X \= Y. + +% 5. Define two predicates `brother/2` and `sister/2`. +brother(X, Y) :- sibling(X, Y), male(X). +sister(X, Y) :- sibling(X, Y), female(X). + +% 6. Define a predicate `siblingInLaw/2`. A sibling-in-law is either married to +% a sibling or the sibling of a spouse. +siblingInLaw(X, Y) :- married(X, SB), sibling(SB, Y) ; married(Y, SP), sibling(X, SP). + +% 7. Define two predicates `aunt/2` and `uncle/2`. Your definitions of these +% predicates should include aunts and uncles by marriage. +aunt(X, Y) :- child(Y, P), (siblingInLaw(X, P) ; sibling(X, P)), female(X). +uncle(X, Y) :- child(Y, P), (siblingInLaw(X, P) ; sibling(X, P)), male(X). + +% 8. Define the predicate `cousin/2`. +cousin(X, Y) :- parent(P1, X), parent(P2, Y), siblingInLaw(P1, P2). + +% 9. Define the predicate `ancestor/2`. +ancestor(X, Y) :- parent(X, Y) ; parent(P, Y), ancestor(X, P). + +% Extra credit: Define the predicate `related/2`. +% TODO +related(X, X, _). +related(X, Y, V) :- not(member(Y, V)), + (child(Y, S), related(X, S, [Y|V]) ; + parent(Y, C), related(X, C, [Y|V]) ; + married(Y, S), related(X, S, [Y|V])). +related(X, Y) :- related(X, Y, []), X \= Y. + +%% +% Part 2. Language implementation (see course web page) +%% +cmd(X) :- number(X). +cmd(X) :- string(X). +cmd(X) :- bool(X). +cmd(add). +cmd(lte). +cmd(if(X, Y)). + +prog([X|T]) :- cmd(X), prog(T). +prog([]). + +if(X, Y) :- prog(X), prog(Y). + +bool(f). +bool(t). + +cmd(X, OS, [X|OS]) :- prog(OS), (number(X) ; string(X) ; bool(X)). +cmd(add, [X, Y | OS], [SUM| OS]) :- number(X), number(Y), is(SUM, X + Y). +cmd(lte, [X, Y | OS], [t | OS]) :- number(X), number(Y), X =< Y. +cmd(lte, [X, Y | OS], [f | OS]) :- number(X), number(Y), X > Y. +cmd(if(P1, _), [t | OS], FS) :- prog(P1, OS, FS). +cmd(if(_, P2), [f | OS], FS) :- prog(P2, OS, FS). + +prog([], S, S). +prog([C|OP], S, FS) :- cmd(C), prog(OP), cmd(C, S, TS), prog(OP, TS, FS).