Prolog_5

19
Prolog Aula #5 Hugo Pires @ Universidade Lusófona do Porto 1

description

ai

Transcript of Prolog_5

  • Prolog Aula #5 H

    ugo

    Pir

    es

    @ U

    niv

    ers

    idad

    e

    Lus

    fon

    a d

    o P

    ort

    o

    1

  • Matching

    Dois termo T1 e T2 unificam se existir uma substituio que os torne literalmente iguais

    T1 == T2

    Dois tomos ou nmeros s unificam se forem exactamente iguais.

    Dois termos compostos unificam se os seus functores principais forem iguais (nome e aridade) e se os argumentos respectivos unificam.

    Uma varivel unifica com qualquer termo se for instanciada com esse termo.

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    2

  • Matching

    Exemplo:

    Os termos data( D, M, 1983) e data( D1, maio, Y) unificam atravs da seguinte instanciao que os torna idnticos

    D=D1

    M=maio

    Y=1983 Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    3

  • Matching

    Exemplo:

    Os termos data( D, M, 1983) e data( D1, maio, 1944) no unificam porque o tomo 1983 diferente de 1944

    A unificao em Prolog sempre realizada utilizando a instanciao mais generalista

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    4

  • Matching

    Em Prolog podemos testar a unificao com o operador =

    Exemplos: ?- data(1,D) = data(Y,293).

    D = 293,

    Y = 1.

    ?- data(1,D) = data(Y,D).

    Y = 1.

    ?- data(1,D) = data(Y,293,1).

    false.

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    5

  • Matching

    A unificao comea por testar o nome dos functores e como estes unificam prossegue para os argumentos, tendo unificar cada par.

    Consideremos agora um outro exemplo:

    ?- triangulo(ponto(1,1), A, ponto(2,3)) = triangulo(X, ponto(4,Y), ponto(2,Z)) . H

    ugo

    Pir

    es

    @ U

    niv

    ers

    idad

    e L

    us

    fon

    a d

    o P

    ort

    o

    6

  • Matching

    ?- triangulo(ponto(1,1), A, ponto(2,3)) = triangulo(X, ponto(4,Y), ponto(2,Z)) .

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    7

    triangulo

    ponto

    1 1

    A ponto

    2 3

    triangulo

    X ponto

    4 Y

    ponto

    2 Z

  • Matching

    So verificadas as seguintes condies mais simples

    triangulo = triangulo

    ponto(1,1) = X

    A = ponto(4,Y)

    ponto(2,3) = ponto(2,Z)

    A unificam sucede pois todas as unificaes mais simples sucedem. A instanciao resultante :

    X=ponto(1,1)

    A=ponto(4,Y)

    Z=3

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    8

  • Aritmtica

    Se colocarmos ao Prolog a questo

    ?- X = 1 + 2.

    Obtemos a resposta

    X=1 + 2

    e no X = 3.

    Para forar o Prolog a efectuar uma operao aritmtica temos de utilizar o operador is

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    19

  • Aritmtica

    Como o operador is fora o clculo da expresso direita obrigatrio que todas as variveis dessa expresso estejam instanciadas

    questo

    ?-X is 1 + 2.

    J obtemos a resposta

    X=3

    Operadores vlidos: +, -, *, /

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    20

  • Aritmtica

    Os seguintes operadores aritmticos pr-definidos comparam os valores das expresses numricas

    =:= =\= < > =< >=

    Operadores para a comparao sintctica de termos

    X == Y (o termo X literalmente igual a Y)

    X \== Y (o termo X no literalmente igual a Y)

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    21

  • Acumuladores

    O operador is permite a utilizao de variveis como acumuladores de valores durante um processo recursivo

    Consideremos o exemplo do somatrio dos elementos de uma lista

    soma(Lista, R)

    Lista uma varivel de entrada (instanciada) e R a varivel de sada que ser instanciada com o resultado aps efetuado o processo de prova

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    23

  • Acumuladores

    Consideremos 2 casos:

    Se a lista vazia o somatrio dos seus elementos igual a 0

    Se a lista no vazia o somatrio dos seus elementos igual a valor da cabea acrescido do somatrios dos elementos da cauda

    Em prolog

    soma([],0).

    soma([H|T],R):-

    soma(T,S), R is H + S.

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    24

  • Acumuladores

    O que acontece se trocarmos a ordem das expresses na segunda regra?

    Erro! S no est instanciado no momento da operao aritmtica!

    Todas as operaes aritmticas ou de comparao tem de ser realizadas sobre variveis previamente instanciadas!

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    25

  • Acumuladores

    Consideremos agora o exemplo do clculo do nmero de elementos de uma lista

    comprimento(Lista, N)

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    26

  • Acumuladores

    Consideremos 2 casos:

    Se a lista vazia tem o comprimento 0

    Se a lista no vazia o seu comprimento igual ao comprimento da cauda acrescido de 1

    Em prolog

    comprimento([],0).

    comprimento([_|T],N):-

    comprimento(T,Nt), N is Nt + 1.

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    27

  • Acumuladores

    O que acontece se trocarmos a ordem das expresses na segunda regra?

    Novamente: Erro! Nt no est instanciado no momento da operao aritmtica!

    Consideremos a seguinte implementao do predicado

    comprimento1([],0).

    comprimento1([_|T],N+1):-comprimento1(T,N).

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    28

  • Acumuladores

    O resultado apresentado como uma operao aritmtica e no como o resultado dessa operao

    Como poderamos produzir esse resultado?

    Ao colocarmos a questo nos seguintes termos ?-comprimento1([a,b,c],N),Res is N.

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    29

  • Exerccios

    Implementar os predicados

    Mximo dos elementos de uma lista.

    Inverso de uma lista

    Hu

    go P

    ire

    s @

    Un

    ive

    rsid

    ade

    Lu

    sfo

    na

    do

    Po

    rto

    30