Prolog
Unidade de Ensino Departamento de Sistemas de Informação Escola de Engenharia Universidade do Minho Guimarães, Portugal Abril, 2008
ii
Índice
1 Introdução 2 Exercícios sobre Prolog 2.1 A Árvore Genealógica da Família Pinheiro 2.2 Exercício sobre Listas 2.3 Stands de Automóveis 3 Regras de Produção 3.1 Gemas Preciosas (regras de produção simples) 3.2 Compras numa Livraria (regras de produção com incerteza) 4 Estruturas Hierárquicas 4.1 Veículos Aéreos (redes semânticas) 4.2 Naves dos Vzorg (enquadramentos, frames) 5 Procura 5.1 Blocos Infantis (procura num espaço de soluções) 5.2 Abertura de um Cofre (procura via gerar e testar) 6 …exibir mais conteúdo…
progenitor(ana,helena). progenitor(ana,joana). progenitor(helena,carlos). progenitor(mario,carlos). sexo(ana,feminino). sexo(maria,feminino). sexo(joana,feminino). sexo(helena,feminino). sexo(mario,masculino). sexo(joao,masculino). sexo(jose,masculino). sexo(carlos,masculino). irma(X,Y):- progenitor(A,X), progenitor(A,Y), X\==Y, sexo(X,feminino). irmao(X,Y):- progenitor(A,X), progenitor(A,Y), X\==Y, sexo(X,masculino). descendente(X,Y):- progenitor(X,Y). descendente(X,Y):- progenitor(X,A), descendente(A,Y). avo(X,Y):- progenitor(X,A), progenitor(A,Y), sexo(X,masculino). mae(X,Y):- progenitor(X,Y), sexo(X,feminino). pai(X,Y):- progenitor(X,Y), sexo(X,masculino). tio(X,Y):- irmao(X,A), progenitor(A,Y). primo(X,Y):-irmao(A,B), progenitor(A,X), progenitor(B,Y), X\==Y. primo(X,Y):-irma(A,B), progenitor(A,X), progenitor(B,Y), X\==Y. % questoes: q1:- progenitor(jose,joao).
4
q1b:- pai(jose,joao). q2(X):- mae(maria,X). q2b(L):-findall(X,mae(maria,X),L). q3(X):- primo(mario,X). q3b(L):- findall(X,primo(mario,X),L). q3c(L):- findall(X,primo(mario,X),LR),list_to_set(LR,L). q4(X):- tio(_,X). q4b(L):- findall(X,tio(_,X),LR),list_to_set(LR,L). q5(X):- descendente(X,carlos). q5b(L):- findall(X,descendente(X,carlos),L). q6a(X):- irmao(helena,X). q6b(X):- irma(helena,X).
5
2.2 Exercício sobre Listas
Enunciado: Represente em Prolog os seguintes predicados genéricos sobre listas (sem utilizar os correspondentes predicados do módulo lists do SWI-Prolog): 1) adiciona(X,L1,L2)