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 origem em Place1, destino em Place2 e uma lista (List_of_flights), com informações sobre o vôo, estruturada da seguinte forma: hora de saída/hora de chegada/número do vôo/lista de dias.
Observação: para utilizar o formato desta base de dados como está, vai precisar redefinir os operadores ``:'' e ``/''. Consulte o manual do Yap em http://www.dcc.fc.up.pt/~vsc/Yap/documentation.html (Appendix A), o manual do swipl em http://www.swi-prolog.org/pldoc/man?predicate=op/3 ou a informação proveniente do livro do Bratko: http://www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/op.html
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 utilizando o predicado: route(Place1,Place2,Day,Route), que satisfaz os seguintes critérios:
A rota (variável Route) deve ser uma lista de elementos com o seguinte formato: From-To:número do vôo:Tempo de partida. Por exemplo, a consulta route(edinburgh,ljubljana,Day,Route) poderia retornar a seguinte resposta: Day=fr, Route=[edinburgh-london:ba4733:9:40,london-ljubljana:ju201:13:20].
Você poderá 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.
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!
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 desta disciplina 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:
Organização do trabalho escrito:
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!
BÔNUS: integre o seu módulo Prolog em uma interface de sua escolha utilizando a ``foreign interface'' de Prolog. O Yap, por exemplo, permite chamadas a código Java e a código C, assim como pode-se invocar predicados Prolog a partir de Java ou de C (mais informações em http://www.swi-prolog.org/packages/jpl/java_api/index.html - Java, ou em http://www.swi-prolog.org/pldoc/man?section=foreign- C).