Assignment 3


pretty( ursula ).

rich( norbert ).
rich( bertha ).

handsome( norbert ).
handsome( pierre ).
handsome( bruno ).

strong( bertha ).
strong( pierre ).

kind( bruno ).

female( ursula ).
female( birtha ).

male( norbert ).
male( pierre ).
male( bruno ).

% male should come before likes
% in general, a recursive rule that calls itself
% before making any change to its arguments will
% loop indefinitely

likes( bertha, Y ) :-
    male( Y ),
    likes( Y, bertha ).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

likes( ursula, X ) :-
    male( X ),
    rich( X ),
    handsome( X ),
    likes( X, ursula ).

likes( ursula, X ) :-    
    male( X ),
    strong( X ),
    handsome( X ),
    likes( X, ursula ).

likes( X, Y ) :-
    male( X ),
    female( Y ),
    pretty( Y ).

likes( X, Y ) :-
    male( X ),
    not( rich( X ) ),
    female( Y ),
    rich( Y ).

happy( X ) :-
    male( X ),
    rich( X ).

happy( X ) :-
    male( X ),
    female( Y ),
    likes( X, Y ),
    likes( Y, X ).

happy( X ) :-
    female( X ),
    male( Y ),
    likes( X, Y ),
    likes( Y, X ).

mutual( X, Y ) :-
    likes( X, Y ),
    likes( Y, X ).

divided( X ) :-
    likes( X, Y ),
    likes( X, Z ),
    Z \== Y.

rivalry( X, Y ) :-
    likes( X, Z ),
    likes( Y, Z ),
    X \== Y.

/* 

| ?- happy(X).

X = norbert ;

X = norbert ;

X = pierre ;

X = ursula ;

X = ursula ;

no
| ?-

add new rule

| ?- ['hw4-b'].
% compiling file C:/russo/elec6730/hw/hw4-b.pl
% hw4-b.pl compiled in module user, 0.150 sec 104 bytes

yes
| ?- mutual(X,Y).

X = ursula,
Y = norbert ;

X = ursula,
Y = pierre ;

X = norbert,
Y = ursula ;

X = pierre,
Y = ursula ;

no
| ?- divided(X).

X = ursula ;

X = ursula ;

no
| ?- rivalry(X,Y).

X = norbert,
Y = pierre ;

X = norbert,
Y = bruno ;

X = pierre,
Y = norbert ;

X = pierre,
Y = bruno ;

X = bruno,
Y = norbert ;

X = bruno,
Y = pierre ;

no
| ?-

We can eliminate the duplicates by adding the following clauses: */

nodup_mutual( L ) :- 
setof( X-Y, ( likes( X, Y ), likes( Y, X ), X @< Y ) , L ). 

nodup_divided( L ) :-
setof( X, ( likes( X, Y ),likes( X, Z ), Z \== Y ) , L ).

nodup_rivalry( L ) :- 
setof( X-Y, ( likes( X, Z ), likes( Y, Z ), X \== Y, X @< Y ) , L ).

/* 

| ?- ['hw4-b'].
% compiling file C:/russo/elec6730/hw/hw4-b.pl
% hw4-b.pl compiled in module user, 0.160 sec 92 bytes

yes
| ?- nodup_mutual(X).

X = [norbert-ursula,pierre-ursula] ;

no

| ?- nodup_divided(X).

X = [ursula]

| ?- nodup_rivalry(X).

X = [bruno-norbert,bruno-pierre,norbert-pierre] ;

no

*/