%% WARNING -- DANGER !! answer (42). %% this is an error!! %% Prolog does not allow the space in the above rule! %% Example family code (Note - you need to paste this into %% the simpsons.pl file, so that the rules are present! sibs( X, Y ) :- parent(A,X), parent(A,Y), X\==Y. aunt( A, N ) :- parent( Q, N ), sibs( Q, A ), female( A ). notaunt( N, A ) :- person(N), person(A), \+ aunt( N, A ). notoldest( X ) :- age(X,AX), age(Y,AY), AY > AX. oldest( X ) :- person(X), \+notoldest(X). rel( X, Y ) :- anc( X, Y ) ; anc( Y, X ). rel( X, Y ) :- anc( Z, X ), anc( Z, Y ). %% Example list code % % member( E, L ) should be true if E is a top-level member of the list L % member should work when E is a variable or bound; L should be bound % member( E, [E|_] ). member( E, [_|R] ) :- member( E, R ). % % reverse( L, Rev ) should be true if Rev is the reverse of the list L % reverse should work when Rev is a variable or bound; L should be bound % reverse( [], [] ). % base case ~ they don't always involve [] in Prolog! reverse( [F|R], Rev ) :- reverse( R, Tmp ), append( Tmp, [F], Rev ). % a helper predicate to define a graph graph1( [ [a,b], [b,c], [c,d], [b,w], [w,x], [x,z], [b,z] ] ). % a helper predicate to define a tree tree1( [ 42, [ 20, [10, [5, [], []], [18, [], []]], [] ], [ 100, [67, [50, [], []], []], [150, [], [2009, [], []]] ] ] ). tree2( [ 42, [20, [], []], [] ] ). fac( 0, 1 ). fac( X, N ) :- Xnew is X-1, fac( Xnew, Nnew ), N is X * Nnew. len( [], 0 ). len( [_|R], N ) :- len( R, LenR ), N is LenR + 1. app( [], M, M ). app( [F|R], M, [F|App] ) :- app( R, M, App ). nnodes( [], 0 ). nnodes( [Root, L, R], N ) :- nnodes( L, NL ), nnodes( R, NR ), N is 1 + NL + NR. lastof( E, [E] ). lastof( E, [_|R] ) :- lastof( E, R ). rev( [], [] ). rev( [F|R], Rev ) :- rev( R, RevR ), append( RevR, [F], Rev ). treefind( E, [E, _, _] ). treefind( E, [F, L, R] ) :- treefind( E, L ) ; treefind( E, R ). kid( Par, Graph, K ) :- member( [Par,K], Graph ). % Succinct! %% showing off var and nonvar reverseFun( L, Rev ) :- var(L), var(Rev), write( 'If you insist...' ), nl, L = [42], Rev = [42]. reverseFun( L, Rev ) :- var(L), nonvar(Rev), reverseFun(Rev, L). reverseFun( [], [] ). reverseFun( [F|R], Rev ) :- nonvar(F), nonvar(R), reverseFun( R, RRev ), append( RRev, [F], Rev ).