Problema logica
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??
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
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$
oppure calcoli il $log_k x=n in ZZ$
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.
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.
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...
multy(x,k) :-
xa is x,
xa
xa is xa*x.
Non so neppure se sintatticamente sia corretto...

"GundamRX91":
Si in prolog si possono fare le funzioni ricorsive.... dovrebbe essere qualcosa del genere:
multy(x,k) :-
xa is x,
xamulty (xa,k),
xa is xa*x.
Non so neppure se sintatticamente sia corretto...
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...
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.
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.
"GundamRX91":
Non so neppure se sintatticamente sia corretto...
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.
Premesso che non conosco il prolog, ho trovato un esempio di funzione ricorsiva e da quella ho "inventato" la mia. Tutto qua.