next up previous
Next: About this document ...

Terceiro Trabalho de Sistemas Inteligentes
Entrega: 17/05/2013
18 de Abril de 2013

  1. Assuma que lhe foi pedido para fazer um programa para planeamento de viagens. O programa é muito simples, mas deve ser capaz de responder questões do tipo:

    O programa deve estar baseado no banco de dados com informações de vôos abaixo, onde timetable(Place1,PLace2,List_of_flights) representa a informação sobre cada vôo com Place1 sendo origem, Place2, destino, e List_of_flights, uma lista contendo informações sobre cada vôo estruturada da seguinte forma: hora de saída/hora de chegada/número do vôo/lista de dias.

    timetable(edinburgh,london,
    		[ 9:40/10:50/ba4733/alldays,
    		 13:40/14:50/ba4773/alldays,
    	 	 19:40/20:50/ba4833/[mo,tu,we,th,fr,su]]).
    
    timetable(london,edinburgh,
    		[ 9:40/10:50/ba4732/alldays,
    		 11:40/12:50/ba4752/alldays,
    	 	 18:40/19:50/ba4822/[mo,tu,we,th,fr]]).
    
    timetable(london,ljubljana,
    		[13:20/16:20/ju201/[fr],
    	 	 13:20/16:20/ju213/[su]]).
    
    timetable(london,zurich,
    		[ 9:10/11:45/ba614/alldays,
    		 14:45/17:20/sr805/alldays]).
    
    timetable(london,milan,
    		[ 8:30/11:20/ba510/alldays,
    		 11:00/13:50/az459/alldays]).
    
    timetable(ljubljana,zurich,
    		[11:30/12:40/ju322/[tu,th]]).
    
    timetable(ljubljana,london,
    		[11:10/12:20/yu200/[fr],
    		 11:25/12:20/yu212/[su]]).
    
    timetable(milan,london,
    		[ 9:10/10:00/az458/alldays,
    		 12:20/13:10/ba511/alldays]).
    
    timetable(milan,zurich,
    		[ 9:25/10:15/sr621/alldays,
    		 12:45/13:35/sr623/alldays]).
    
    timetable(zurich,ljubljana,
    		[13:30/14:40/yu323/[tu,th]]).
    
    timetable(zurich,london,
    		[ 9:00/9:40/ba613/[mo,tu,we,th,fr,sa],
    	 	 16:10/16:55/sr806/[mo,tu,we,th,fr,su]]).
    
    timetable(zurich,milan,
    		[ 7:55/8:45/sr620/alldays]).
    

    Seu problema principal é encontrar rotas exatas entre duas cidades num determinado dia da semana. A rota pode ser programada como: route(Place1,Place2,Day,Route), que satisfaz os seguintes critérios:

    A rota deve estar estruturada numa lista da seguinte forma: From-To:número do vôo:Tempo de partida.

    Você vai precisar também dos seguintes predicados auxiliares:

    Escreva um programa em Prolog, utilizando a informação dada, que responda às perguntas apresentadas acima.

    Escreva o mesmo programa utilizando uma linguagem (imperativa/procedural) da sua escolha.

  2. Escreva um programa em Prolog, utilizando DCG (Definite Clause Grammar), que faça análise de frases em português. Uma parte de uma gramática para o português é dada na Figura 2, onde a primeira sentença fala sobre a estrutura de frases no singular e a segunda fala sobre a estrutura de frases no plural. Esta sintaxe é aceita por Prolog! (consultar ``Definite Clause Grammars'' - DCGs em qualquer livro sobre Prolog). Uma sentença é composta por uma frase nominal seguida por uma frase verbal. Parte das regras que definem uma frase nominal estão representadas pela cláusula frase_nom.

    Defina o restante da gramática (frases verbais, complementos) e um dicionário de palavras (verbos, nomes, adjetivos, etc) e utilize o conjunto de frases da Figura 2 para testar seu programa. Atenção aos apóstrofes que devem ser utilizados quando as palavras nas frases começam com letra maiúscula!

    Figure 1: Subconjunto de estrutura da língua portuguesa
    \begin{figure}\hrulefill
\begin{center}
\begin{verbatim}sentenca -> frase_no...
...f.
frase_nom_p -> subst_p_m.\end{verbatim}
\end{center}\hrulefill
\end{figure}

    Figure 2: Conjunto de frases para teste (ao alto, frases corretas; embaixo, frases incorretas)
    \begin{figure}\hrulefill
\begin{center}
\begin{verbatim}FRASES CORRETASsen...
...[O,sino,bateu,na,meninas],[]).\end{verbatim}
\end{center}\hrulefill
\end{figure}

    Faça uma pequena modificação no seu programa para que este retorne a estrutura gramatical das frases analisadas. Por exemplo, a consulta sentenca(X,['A',vida,corre],[]) deveria retornar na variável X o valor:

    sent(frase_nom(artigo('A'),substantivo(vida)),frase_verbal(verbo(corre))).

    Observe que a frase do conjunto de exemplos corretos ``O sino bateu na menina'' é sintaticamente correta, mas é semanticamente incorreta. Há técnicas para codificação de gramáticas com semântica associada, porém este tema está fora do escopo deste curso e deste trabalho.

    Escreva o mesmo programa utilizando uma linguagem (imperativa/procedural) da sua escolha.

Juntem-se em grupos de 2 elementos, onde um elemento do grupo vai fazer a implementação em Prolog e o outro vai fazer a implementação em outra linguagem. No relatório vão relatar as facilidades/dificuldades de implementação que cada um teve.

Entregar:

  1. trabalho escrito com a descrição da implementação.

    Organização do trabalho escrito:

    Introdução

    Descrição/Representação do problema em Prolog

    Descrição/Representação do problema em outra linguagem

    Comentários sobre representação do conhecimento e facilidades/dificuldades de implementação nas duas linguagens

    Comentários Finais e Conclusões

  2. enviar o código fonte dos programas, como compilar e formato da entrada para cada problema, isto é, um pequeno manual de como rodar os programas (pode ser um 'help' ou 'readme'). Além disso, em que ambiente foi compilado (tipos e versões do SO e da linguagem). Seu programa deve correr na minha máquina (com fedora instalado). Não assuma que eu tenho uma IDE (Integrated Development Environment) de qualquer tipo. O programa deve correr na linha de comando.

    A submissão será através do Moodle UP. Por favor, não inclua caracteres acentuados no nome do ficheiro de submissão.

Todos os trabalhos serão apresentados em data a combinar. Os dois componentes do grupo deverão estar presentes durante a apresentação. Quem nao estiver presente vai ter nota zero!




next up previous
Next: About this document ...
InĂªs Dutra 2013-05-14