Jump to content
carvalho2707

[Resolvido] Exercícios de listas

Recommended Posts

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).

Share this post


Link to post
Share on other 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 ...

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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 )

Share this post


Link to post
Share on other 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).

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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).

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites
carvalho2707

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

Edited by carvalho2707

Share this post


Link to post
Share on other sites
carvalho2707

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

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

Share this post


Link to post
Share on other 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?

Edited by Rui Carlos
Formatação do código.

Share this post


Link to post
Share on other sites
HappyHippyHippo

quais foram os dados de teste que usaste ?

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other sites
carvalho2707

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

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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"

Edited by carvalho2707

Share this post


Link to post
Share on other sites
HappyHippyHippo

é impossível teres a aplicação a ser interpretada sem o predicado suspeito !!!


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

Share this post


Link to post
Share on other 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, _, _)],

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.