Planejar uma Rota enunciado do exercício mapa (um caso de teste) características do programa
Planejar Rotas Escrever programa que planeja uma rota entre duas cidades fornecendo horários de duração de viagem. O mapa deve incluir quilômetro, condições de estrada e disponibilidade de postos de combustível.
Rota no Mapa Ribeirão Preto São Carlos Araçatuba Bauru Assis São Carlos Presidente Prudente 120km 60min 200km 120min 170km 150km 90min 325km 180min 99km 50min 140km 70min Dados não-reais
Este exercício é um exemplo de aplicação no PROLOG onde o usuário terá as informações sobre o horário de duração de viagem de uma cidade Origem (Ribeirão Preto) para uma cidade Destino (Assis). A informação sobre a distância, condições de estrada e disponibilidade de posto de combustível também podem ser obtidas como informações extras. Podendo mais tarde, a pesquisa ser incrementado a partir de critérios analisados sobre a disponibilidade de posto de gazolina e as condições da estrada obter o melhor caminho.
estrada(X) - informa as condicões da estrada de acordo A operação abaixo indica que existe um caminho único partindo de 'Origem’ até 'Destino', o qual leva 'Tempo' minutos para ser percorrido numa distância de 'Dist'. 'CondicaoDaEstrada' assumirá os valores mostrados acima conforme as condicões da estrada, e 'DisponibilidadeDePosto' assumira 0 (zero) caso existam postos de combustivel nesse trajeto, ou 1 (hum) caso contrário. estrada(X) - informa as condicões da estrada de acordo com o valor passado para X, onde X = 1...3. X = 1 - será mostrado na tela que a estrada é boa X = 2 - será mostrado na tela que a estrada é media X = 3 - será mostrado na tela que a estrada é ruim arco(Origem,Destino,Tempo,Dist,CondicaoDaEstrada,DisponibilidadeDePosto)
not( member(CidadeX,Historia)), member( ) - verifica se determinada cidade já faz parte da lista de cidades que compõem a rota até a cidade destino. not( ) - nega a existencia de uma cidade na lista de rota, caso a cidade jah tenha sido incluida, isto eh, as cidades jah adicionadas nao serao repetidas na rota.
Distancia is Distancia1 + Dist. Foi utilizado o operador matematico de adicao (+) para calcular a distancia total entre a cidade de origem e o destino. Analogamente, esse operador foi empregado para calcular o tempo total de viagem entre a cidade de origem e o destino. Tempo is Tempo1 + T, Distancia is Distancia1 + Dist. Nota-se que a sintaxe nesse caso deve ser, por exemplo, para o tempo : Tempo is Temp1 + T Onde a variavel Tempo recebera o conteudo da variavel Temp1 mais o conteudo de T. Uma sintaxe do tipo: Tempo = Temp1 + T causaria um erro, pois o PROLOG tentaria unificar Tempo com Temp1 + T, que visivelmente sao coisas distintas.
Utiliza-se o operador write( ) para produzir a saída dos resultados na tela, de forma que o usuário possa visualizá-los. Ao final da execucão, o programa mostra a distância total e o tempo total para percorrer de Origem até o Destino. escreve(Rota,CondcaoEstrada,Tempo,Distancia,Origem,Destino):- write('Para ir da cidade '),write(Origem),write(' ate a cidade '), write(Destino), nl, write('O tempo gasto eh '),write(Tempo), nl, write('A distancia total eh '), write(Distancia),nl, escreve(Rota,CE).
Para a resolucão deste problema, foi imprescíndivel o uso de listas para montar a rota das cidades que ligam a Origem ate o Destino. Isso foi feito devido a facilidade de expansão, pois a Base de Conhecimento dos arcos que ligam as cidades pode aumentar. As listas são uma ótima abordagem para o tratamento desse tipo de problema, podendo ser facilmente extraída da lista o primeiro elemento, ou mesmo verificar se determinada cidade já faz parte da lista de rotas.
arco(ribeirãoPreto,Araçatuba,180,325,3,1). A utilizacão das estrutura de arcos é importante como forma de diminuir o espaço ocupado pela Base de Conhecimento e diminuir a quantidade de interacões, favorecendo assim a rapidez na resposta. arco(ribeirãoPreto,Araçatuba,180,325,3,1). arco(ribeirãoPreto,sãoCarlos,50,99,1,0). arco(araçatuba,presidentePrudente,120,200,2,0). arco(araçatuba,bauru,90,150,2,1). arco(presidentePrudente,assis,60,120, 1,1). arco(assis,bauru,110,170,3,0).
dist(cidadeA, cidadeB, Km) duracao(cidadeA, cidadeB, Tempo) Poderiamos ter representada a base de conhecimento da seguinte maneira : dist(cidadeA, cidadeB, Km) informaria a distancia da cidadeA ateh a cidadeB em Km duracao(cidadeA, cidadeB, Tempo) informaria a duracao da viagem da cidadeA ateh a cidadeB em minutos
posto(cidadeA, cidadeB, S) informaria a disponibilidade de postos de combustivel entre a cidadeA e a cidadeB, onde S poderia se 1 caso houvessem postos, ou S seria 0 caso contrario estrada(cidadeA, cidadeB, Cond) informaria as condicoes da estrada entre a cidadeA e a cidadeB, onde: Cond = boa Cond = media Cond = ruim