pai( a, c ). pai( a, d ). pai( c, g ). pai( c, h ). pai( d, i ). pai( d, j ). pai( f, k ). pai( f, l ). mae( e, i ). mae( e, j ). mae( b, e ). mae( b, f ). progenitor( X, Y ) :- pai( X, Y ). progenitor( X, Y ) :- mae( X, Y ). irmao( X, Y ) :- progenitor( Z, X ), progenitor( Z, Y ), X \= Y. primo( X, Y ) :- progenitor( PX, X ), progenitor( PY, Y ), irmao( PX, PY ). primo_grau_n( X, Y ) :- primo( X, Y ). primo_grau_n( X, Y ) :- % <- primo( X, Z ), primo_grau_n( Z, Y ), X \= Y, \+ irmao( X, Y ). % Negacao por falha mesma_geracao( X, Y ) :- irmao( X, Y ). mesma_geracao( X, Y ) :- primo_grau_n( X, Y ). todos_primos_grau_n( X, Ps ) :- todos_primos_grau_n( X, [], Ps ). todos_primos_grau_n( X, As, Ps ) :- write( As ), nl, primo_grau_n_unico( X, Y ), \+ member( Y, As ), !, todos_primos_grau_n( X, [Y|As], Ps ). todos_primos_grau_n( _, Ps, Ps ). % Execicio %1) primo_de_grau( N, X, Y ) : X e' primo de grau N de Y % programa errado pois submete variavel nao-instanciada `a negacao por falha primo_n( X, Y ) :- primo( X, Y ). primo_n( X, Y ) :- % <- not( irmao( X, Y )), % Negacao por falha primo( X, Z ), primo_n( Z, Y ), X \= Y. %somatorio( Xs, N ): N e' a soma de elementos de Xs somatorio1( [], 0 ). somatorio1( [X|Xs], N ) :- somatorio1( Xs, M ), N is X+M. somatorio2( Xs, N ) :- soma2( Xs, 0, N ). soma2( [], Acc, Acc ). soma2( [X|Xs], Acc, N ) :- NovoAcc is Acc + X, soma2( Xs, NovoAcc, N ). primo_grau_n_unico( X, Y ) :- pgnu( X, [], Y ). pgnu( X, Ps, Y ) :- primo( X, Y ), \+ member( Y, Ps ). pgnu( X, Ps, Y ) :- primo( X, Z ), \+ member( Z, Ps ), pgnu( Z, [Z|Ps], Y ), X \= Y, \+ irmao( X, Y ). % Negacao por falha