Revisada: 2015-11-02 (Lisp) Revisada: 2015-10-03 (input normal .txt) Revisada: 2015-09-14 (como fazer um módulo para entrega) Revisada: 2015-08-27 (lista de problemas) Revisada: 2015-08-26 (input "mastigado") Revisada: 2015-08-13 Criada: 2015-07-23
Seu programa receberá um problema na forma de duas expressões Lisp, a primeira contendo domínios e a segunda contendo restrições, por exemplo:
((domain(cor) azul branca preta) (domain(nacionalidade) alemao brasileiro espanhol) (domain(animal) borboleta cachorro cavalo) (domain(esporte) futebol tenis sinuca)) ((or (= brasileiro 1) (= brasileiro 3)) (= cachorro futebol) (= (+ tenis 2) preta) (= cavalo (- borboleta 1)) (= cachorro (+ branca 1)) (= espanhol 3))
O problema deverá ser lido de uma arquivo com extensão .lisp. Seu programa deverá ser escrito dentro de um pacote Lisp e deverá implementar uma função solver
que recebe um nome de arquivo contendo as expressões acima descritas e retorna a solução do problema na forma de uma lista como segue:
((alemao 1) (espanhol 3) (italiano 2) (azul 1) (vermelha 2) (preta 3))
O programa abaixo exemplifica o formato. Este programa apenas dá valores aleatórios às variáveis. Substitua neste código o símbolo your_package_name_here
por um nome mais significativo, escolhido por você, e obviamente, o código da função solver
pelo código que você desenvolver para resolver o problema. Pode acrescentar funções auxiliares ao arquivo, que pode ter qualquer nome.
(make-package 'your_package_name_here) (in-package your_package_name_here) (common-lisp:use-package 'common-lisp) (export 'solver) (defun solver (path) (with-open-file (f path) (let* ((domains (read f)) (constraints (read f)) ) (setf *random-state* (make-random-state t)) (mapcar #'(lambda(x) (list x (1+ (random (- (length (car domains)) 2))))) (apply #'append (mapcar #'cddr domains)) ) ) ) )
Submeta seu programa (jogador) através do nosso sistema de submissão, dando ao jogador o mesmo nome que deu ao pacote.
A partir de 2015-10-02, apenas serão aceitos programas que leiam os arquivos .txt dos problemas diretamente. Todos os pontos dos jogadores submnetidos anteriormente foram zerados, para que os pontos das novas versões não sejam contaminados pelas pontuações anteriores. Veja aqui a situação imediatamente antes da mudança.
Seu desafio será escrever um programa que resolve certos problemas de lógica como o descrito a seguir.
Tente descobrir quem mora em qual casa e as demais características a partir das seguintes dicas:
Seu programa receberá um problema na forma de um arquivo de texto contendo todos os dados e dicas do problem. O arquivo texto terá duas seções. Na primeira seção, os domínios das características serão dados. No exemplo acima, os domínios seriam os seguintes:
cor: vermelha, verde, branca, amarela, azul nacionalidade: noruegues, ingles, sueco, dinamarques, alemao bebida: cha, cafe, leite, cerveja, agua cigarro: pallmall, dunhill, blends, bluemaster, prince animal: cachorro, gato, passaro, cavalo, peixe
Uma linha em branco separa a primeira seção da segunda
A segunda seção conterá as dicas, codificadas da seguinte forma. Cada estado de cada característica representa um número inteiro de 1 a N (no exemplo, N=5) que corresponde à posição daquela característica na solução. Assim, por exemplo, a dica de que "O norueguês vive na primeira casa" será codificada como segue:
noruegues = 1
Outros exemplos de tradução de dicas:
O inglês vive na casa vermelha
ingles = vermelha
A casa verde fica do lado esquerdo da casa branca
verde + 1 = branca
O homem que cria cavalos vive ao lado do que fuma Dunhill
|cavalo - dunhill| = 1
E assim por diante. Cada linha da seção de dicas deverá ser lida e processada pelo seu programa, que deverá obter uma soluçao que satisfaça todas as dicas. Sua solução deverá ser impressa num arquivo texto com linhas da forma:
estado = numero
e deverá ter tantas linhas quantos estados, juntando todas as caraterísticas. A ordem em que os estados aparecem não é importante. Lembre-se que estados da mesma característica não podem ter mesmo valor.
Seu programa deverá ser entregue em um único arquivo fonte, que define um módulo, ou seja, começa com a seguinte linha de código:
:- module(nome, [solver/2]).
onde nome é o nome de seu jogador. O nome do arquivo em si não importa, embora a convenção usual é chamá-lo de nome.prolog ou nome.pl.
Após esta linha, vem o resto de seu código, incluindo a definição do predicado solver/2.
O formato "normal" significa que os alunos deverão escrever um predicado
solver(+Filename, -S)
que é satisfeito quando S é a solução do problema de lógica especificado pelo arquivo de nome Filename (por exemplo, p3.txt).
A partir de 02/10/2015, apenas o formato normal será aceito para avaliação das submissões.
Conforme mencionado na aula de 25/08/2015, durante um período incial, os alunos terão que desenvolver apenas a parte de resolução do problema, sendo a entrada oferecida de forma "mastigada", mais apropriada para ser tratada em Prolog. Posteriormente, a partir de 02/10/2015, após aprenderem gramáticas, complementarão seu projeto com a parte que trata a entrada .txt para obter o formato desejado.
O formato "mastigado" significa que os alunos deverão escrever um predicado
solver(+D, +C, -S)
que é satisfeito quando S é a solução do problema de lógica especificado pelos domínios em D e pelas restrições (constraints) em C.
Para exemplificar os formatos de D, C e S usaremos o problema P1 a seguir:
cor: azul, vermelha, preta nacionalidade: alemao, espanhol, italiano espanhol = vermelha + 1 alemao = azul italiano = 2
Neste caso, D
será dado como:
D = [[domain(cor), azul, vermelha, preta], [domain(nacionalidade), alemao, espanhol, italiano]]
A lista de restrições C
será dada como:
C = [[=, espanhol, [+, vermelha, 1]], [=, alemao, azul], [=, italiano, 2]]
e a solução S esperada será:
S = [c(alemao, 1), c(espanhol, 3), c(italiano, 2), c(azul, 1), c(vermelha, 2), c(preta, 3)]
A ordem dos elementos em S não é relevante, mas todas as variáveis de todos os somínios devem aparecer uma vez só, com o valor correto.
Se o seu programa tiver um bom desempenho, resolvendo um alto percetual dos problemas propostos a ele, concorrerá na categoria Master. Caso não consiga resolver problemas suficientes, concorerrá na categoria Junior.
Programas na categoria Junior terão nota de 0 a 5, calculada como percentual dos problemas resolvidos vezes 5,0. Programas na categoria Master terão notas de 5 a 10, calculada em função do tempo médio que levam para resolver um problema. Excluidos tempos extremos (se houver), o tempo menor receberá 10, o tempo maior receberá 5 e os demais serão interpolados com uma fórmula justa ainda a decidir.
Datas importantes:
Data | Atividade |
---|---|
27/08/2015 | começam submissões Prolog |
08/10/2015 (adiado para 13/10/2015) | terminam submissões Prolog |
13/10/2015 (adiado para 03/11/2015) | começam submissões Lisp |
17/11/2015 | terminam submissões Lisp |
Os códigos dos alunos serão analisados para ver se contém comandos maliciosos, como tentatva de subverter código do gerenciador ou de colegas, tentativa indevida de acesso ao sistema de arquivos local, tentativa indevida de acesso à rede, etc. Quaisquer arquivos fonte que contiverem comandos considerados maliciosos serão descartados e o aluno que os tiver submetido receberá zero na disicplina como punição, sem prejuízo de outras sanções. Programas iguais ou muito parecidos serão passíveis da mesma punição. Além disso, cada aluno deverá ser capaz de explicar todo o seu código ao instrutor, em entrevista marcada especialmente para este fim. Caso o aluno não demonstre cabal conhecimento de seu próprio código, receberá também zero na disciplina
© 2015 João Meidanis