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
carvalho2707

nao vi nada da sintaxe que usaste xd

nao ha forma mais simples?

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • 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.