Problema logica

dopamigs
salve a tutti,
devo fare un programma in prolog che mi chiede di prendere da una lista di numeri interi solo i numeri che sono potenza di un numero k e metterli in un'altra lista di output..

come facccio a verificare se un numero x è potenza di k??

Risposte
gundamrx91-votailprof
per $x in ZZ$ potresti verificare che $x=k_1*k_2*k_3*_...*k_n$ dove ovviamente $k_1=k_2=k_3_...k_n=k$

oppure calcoli il $log_k x=n in ZZ$

vict85
Ammetto di non essere un esperto ne di logica ne di prolog ma in prolog puoi scrivere formule ricorsive? Mi spiego...

Se [tex]\varphi(x)[/tex] è una formula che esprime gli elementi multipli di [tex]k[/tex] allora:
[tex]\varphi(x)[/tex] è vero
[tex]\varphi(b) = \exists a [(ak = b) \wedge \varphi(a)][/tex]

Ma forse esistono altri modi.

gundamrx91-votailprof
Si in prolog si possono fare le funzioni ricorsive.... dovrebbe essere qualcosa del genere:

multy(x,k) :-
xa is x,
xa multy (xa,k),
xa is xa*x.


Non so neppure se sintatticamente sia corretto... :-D

dopamigs
"GundamRX91":
Si in prolog si possono fare le funzioni ricorsive.... dovrebbe essere qualcosa del genere:

multy(x,k) :-
xa is x,
xa multy (xa,k),
xa is xa*x.


Non so neppure se sintatticamente sia corretto... :-D


ma questo verifica se x è un multiplo di K??

io devo verficare se x è una potenza di k...cioè es:

1 è una potenza di 2 2^0=1 8 è una potenza di 2 2^3=8
6 non è una potenza di 2...

gundamrx91-votailprof
posto $x=2$ e $k=8$ dovrebbe ciclare sino a quando $xa quindi al primo ciclo parto con $xa=2$, che e' minore di $8$, lo moltiplico per $2$, cioe' $4$, e riassegno il risultato a $xa$ stesso,
riprendo il ciclo ed essendo $4<8$ moltiplico ancora $xa=4$ per $2$, che fa $8$, quindi al test esce dal ciclo in quanto $xa=8=k=8$

Il problema e' che non ho assolutamente idea se il codice che ho scritto sia sintatticamente e semanticamente corretto, pero' questo dovresti
saperlo tu e nel caso correggerlo di conseguenza.

vict85
"GundamRX91":
Non so neppure se sintatticamente sia corretto... :-D


Sinceramente penso che dal punto di vista dei linguaggi del primo ordine non sia assolutamente corretto. D'altra parte è un modo per esprimere ricorsivamente i multipli di un numero.

gundamrx91-votailprof
Premesso che non conosco il prolog, ho trovato un esempio di funzione ricorsiva e da quella ho "inventato" la mia. Tutto qua.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.