• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Alkaline

[AJUDA] Lógica e Computação - capicua (urgente)

4 mensagens neste tópico

Boas. Tenho um trabalho de Lógica e Computação para fazer e estou com alguns problemas, passo a explicar: tenho que, dadas as seguintes permissas criar 1 predicado que verifique se uma lista é capicua!

Lista vazia = vazia

Lista com cabeça c e resto r (uma lista) = lista(c,r)

Premissas:

/* Dimensão de uma lista */

diml(vazia,0).

@(c,@(r,@(dr,@(d,diml(r,dr)*&soma(dr,1,d)->diml(lista(c,r),d))))).

/* Membro de uma lista */

@(c,@(r,membro(c,lista(c,r)))).

@(c,@(r,@(x,membro(x,r) -> membro(x,lista(c,r))))).

/* Juntar um elemento no fim de uma lista */

@(x,juntarfim(x,vazia,lista(x,vazia))).

@(x,@(c,@(r,@(k,juntarfim(x,r,k)->juntarfim(x,lista(c,r),lista(c,k)))))).

/* Inverter uma lista */

inverter(vazia,vazia).

@(c,@(r,@(k,@(i,inverter(r,k)*juntarfim(c,k,i)->inverter(lista(c,r),i))))).

As premissas foram feitas pelo engenheiro. A "solução" que encontrei foi esta:

@(x,capicua(lista(x,vazio))).

@(x, @(y, capicua(lista(x, y)) -> igual(lista(x, y),inverter(lista(x,y))))).

O meu problema é mesmo como fazer o código para ver se são iguais, o inverter já tenho.

Isto é feito num programa chamado LOGIS, que é baseado em Prolog, feito pelos engenheiros.

PS: o @ = qualquer que seja.

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

se desse uma breve explicação da sintaxe dessa linguagem ajudava...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom, basicamente tens o @ e o #.

@ lê-se qualquer que seja e # lê-se existe um. Quando tens isto associado a uma letra, essa letra é tomada como variável.

// @(x , pai(x) ) isto lê-se para qualquer x, pai(x)  é verdadeiro (todo o x tem pai)

Depois podes fazer cenas mais complexas em que metes os símbolos lógicos

-  (negação)

*  (and lógico)

+  (or lógico)

-> (implicação) // A->B    A verdadeiro se B verdadeiro

<-> (implicação estrita) // A<->B  só é verdade para os dois membros verdadeiros.

:thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom, a solução que encontrei para o meu problema foi esta:

/* Capicua */

@(c,@(r,@(i,((inverter(lista(c,r),i)*iguais(lista(c,r),i))->capicua(lista(c,r)))))).

/* Igual */

iguais(vazia,vazia).

@(c,@(r,iguais(lista(c,r),lista(c,r)))).

0

Partilhar esta mensagem


Link 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