Jump to content

[Resolvido] Exercícios de listas


carvalho2707
 Share

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

HappyHippyHippo

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

como disse, ProLog foi à imenso tempo.

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

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
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 😄 )

Link to comment
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).
Link to comment
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.

Link to comment
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 😄 )

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
Link to comment
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.

Link to comment
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
Link to comment
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?

Link to comment
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).

Link to comment
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?

Link to comment
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?

Link to comment
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.

Link to comment
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?

Link to comment
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
 Share

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