Ir para o conteúdo
carvalho2707

[Resolvido] Exercícios de listas

Mensagens Recomendadas

carvalho2707

boas, estou a tentar criar um programa em prolog que me diga se A está à esquerda de B numa lista..

o meu programa funciona para estes casos:

[A,B]

[A,......,B]

mas nao funciona no caso em que A não está na primeira posição..

alguem me consegue ajudar?

esquerda(S1,S2,[s1|R]):-membro(S2,R).
esquerda(S1,S2,[_|R]):-esquerda(S1,S2,R).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

ja não pego em prolog à milénios mas acho que deverá ser algo assim :

esquerda(S1,S2, [Head|Tail]) :-
     S1 == Head, membro(S2,Tail);         % S1 encontrasse à cabeça e 2 no resto da lista (; é o mesmo que ter "ou")
     S2 \== Head, esquerda(S1, S2, Tail). % O elemento à cabeça não pode ser S2 e "esquerda" sucede no resto da lista

acho que existe uma sintaxe mais prática que trata o primeiro elemento da lista, mas não me lembro ...

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

eu nem sei se o código que apresentei está 100% correcto :D

como disse, ProLog foi à imenso tempo.

não acho que esteja muito complicado de perceber ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Também já não mexo em Prolog há algum tempo... Mas pegando na solução do HappyHippyHippo, eu faria assim:

esquerda(S1, S2, [s1|Tail]) :- member(S2,Tail).
esquerda(S1, S2, [_|Tail]) :- esquerda(S1, S2, Tail).

(Não garanto que esteja correcto :D)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carvalho2707

rui, esse foi o código que eu fiz xd mas so funciona se o S1 for o primeiro elemento da lista , por exemplo:

[s1,....S2]

eu queria que também funcionasse para [.....S1......S2......]

eu alterei o código e funciona para tudo excepto quando ha alguma coisa no meio:

esquerda(S1,S2,[s1,S2|_]).
esquerda(S1,S2,[_|R]):-esquerda(S1,S2,R).
esquerda(S1,S2,[s1|R]):-membro(S2,R).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

A segunda linha do código que apresentei é para o caso em que não é o primeiro elemento da lista.

esquerda(1, 2, [0,1,2])

--> esquerda(1, 2, [1, 2])

--> member(2, [2])

--> true

No código que tens, parece-me que a primeira linha é desnecessária.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Também já não mexo em Prolog há algum tempo... Mas pegando na solução do HappyHippyHippo, eu faria assim:

esquerda(S1, S2, [s1|Tail]) :- member(S2,Tail).
esquerda(S1, S2, [_|Tail]) :- esquerda(S1, S2, Tail).

(Não garanto que esteja correcto :D)

a razão da minha solução se ter desviado desta é esta :

{ ..., S2, ..., S1, ..., S2, ... }

como podes ver, a preposição sucede porque existe um S2 à direita de S1, mas solução ignora a existência do S2 à esquerda.

foi por isso que forcei a S2 nunca ser o Head da lista

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos
boas, estou a tentar criar um programa em prolog que me diga se A está à esquerda de B numa lista..

Diria que em [b, A, B], A está à esquerda de B (e à direita também, mas há alguma restrição que impeça isto?). O enunciado não é claro neste ponto, mas assumi que se podia ignorar a existência de Bs às esquerda.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

pois, quando a coisa não é branca nem preta um gajo não sabe que cinzento é ...

no entanto é melhor não pecar por desleixo, e foi por isso que impus a regra que se fica à esquerda, não pode existir a possibilidade de estar à direita.

como um programa de ProLog é feito de preposições, é normal existir preposições para os casos possíveis : "direita", "esquerda", "meio" e "sozinho". é por essa razão que eu (e volto a afirmar que foi "eu") assumi que o conceito de esquerda não pode ser interpretado por "meio" no contexto programático da aplicação pois irá baralhar as preposições.


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carvalho2707

supostamente o meu programa diz:

esquerda(s1, s2, Suspeitos): indica que o suspeito s1 está a esquerda.

do suspeito s2 (não necessariamente na posição imediatamente a seguir);

o meu código funciona para:

esquerda(A,B,[A,B])

esquerda(A,B,[C,D,A,B])

mas não para esquerda(A,B,[A,C,D,B])

eu não vejo onde é que nas minhas regras isso esta escrito.

esquerda(S1,S2,[s1|R]):-membro(S2,R). esta linha supostamente faz isso , ou não?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

?- esquerda(1,2,[1,2,3,4,5]).
true .

?- esquerda(1,2,[0,1,2,3,4,5]).
true .

?- esquerda(1,4,[0,1,2,3,4,5]).
true .

?- esquerda(0,5,[0,1,2,3,4,5]).
true .

?- 

O único problema que o teu código pode ter é no predicado membro (eu utilizo o member).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carvalho2707

?- esquerda(1,2,[1,2,3,4,5]).
true .

?- esquerda(1,2,[0,1,2,3,4,5]).
true .

?- esquerda(1,4,[0,1,2,3,4,5]).
true .

?- esquerda(0,5,[0,1,2,3,4,5]).
true .

?- 

O único problema que o teu código pode ter é no predicado membro (eu utilizo o member).

Rui, que codigo usaste para fazer esses testes?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

Rui, que codigo usaste para fazer esses testes?

esquerda(S1, S2, [s1|Tail]) :- member(S2,Tail).
esquerda(S1, S2, [_|Tail]) :- esquerda(S1, S2, Tail).

Como te disse, a única diferença é que estou a usar o predicado member.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carvalho2707

esquerda(S1, S2, [s1|Tail]) :- member(S2,Tail).
esquerda(S1, S2, [_|Tail]) :- esquerda(S1, S2, Tail).

Como te disse, a única diferença é que estou a usar o predicado member.

o predicado member és tu a implementar certo?

o meu é :

membro(X, [X | _]).
membro(X, [_ | R]) :- membro(X, R).

está igual ao teu?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

O predicado member já existe no interpretador.

Mas esperaria que fosse semelhante.

Pode ser que o problema esteja no interpretador. Usei o SWI-Prolog, e lembro-me que havia algumas coisas que funcionavam de forma ligeiramente diferente noutros interpretadores.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carvalho2707

vou usar o member do swi então..ja digo noticias

funcionou mesmo ;) obrigado, nao sei porque mas percebi que dava erro..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carvalho2707

já agora aproveito o topico para esclarecer outra duvcida:

quero fazer o predicado "ou(t1,t2,t3,lista)" que diz que t1 é igual a t2 ou t3, mas nunca aos dois..

eu fiz isto:

ou(S1,S2,S3,_):- S1 == S3, S1 \== S2.
ou(S1,S2,S3,_):- S1 == S2, S1 \== S3.

ao testar

?- ou(1,2,3,_).
false.
?- ou(1,1,3,_).
true.
?- ou(1,1,1,_).
false.
?- ou(1,2,1,_).
true.

mas no projecto, quando S1 é uma estrutura dá false:/

alguem consegue perceber o que está a falar no codigo?

Editado por Rui Carlos
Formatação do código.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carvalho2707

supostamente nos recebemos varias pistas, mas o ficheiro de testes que tenho diz:

ou(suspeito(_, '800000', _, _, _, _),
	 suspeito(_, _, _, 'maravilhosa', _, _),
	 suspeito(_, _, _, _, _, botas), Suspeitos),

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

suspeito é um predicado que será avaliado como verdadeiro ou falso.

se o que testaste deu sempre falso, então é porque os predicados resolveram sempre como verdadeiros (todos iguais) ou todos falsos (todos iguais também), porque não vejo problemas no teu predicado "ou".

verifica que o predicado "suspeito" está correctamente programado


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carvalho2707

suspeito é um predicado que será avaliado como verdadeiro ou falso.

se o que testaste deu sempre falso, então é porque os predicados resolveram sempre como verdadeiros (todos iguais) ou todos falsos (todos iguais também), porque não vejo problemas no teu predicado "ou".

verifica que o predicado "suspeito" está correctamente programado

mas eu nao o defini :/ o que posso alterar?

o trabalho era constituido por varias pistas : "lado", "entre", "existe","ou","esquerda2,"direita"..

eu passo nos testes que nao têm o ou, achas que pode ser aluns destes predicados que esta mal?

é que eu nao acredito, como passa nos testes todos sem "ou"

Editado por carvalho2707

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
carvalho2707

no ficheiro de testes existe isto que é essa a definiçao certo?:

Suspeitos = [suspeito(_, _, _, _, _, tenis), _, _, _, _, _],
Suspeitos = [_, suspeito(_, _, _, _, _, havaianas), _, _, _, _],
Suspeitos = [_, _, _, suspeito(_, _, bazuca, _, _, _), _, _],
Suspeitos = [_, _, _, _, suspeito('Agent Smith', _, _, _, _, _), _],
Suspeitos = [_, _, _, _, _, suspeito(_, _, _, boa, _, _)],

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.