Pages: [1]   Go Down
Print
Author Topic: richiamo funzione prolog  (Read 1918 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
rox
Forumista
***
Offline Offline

Posts: 633


« on: 23-08-2014, 10:08:30 »

Salve a tutti, come da oggetto, non ho ben chiaro come si possa richiamare una funzione prolog definita anzitempo...
io per prima cosa ho fatto il fattoriale, utilizzando 2 parametri in questo modo:
Code:
fatt(0,1):- !.
fatt(N,F):- M is N-1,
fatt(M,K),
F is N*K.
in questo modo poi io da terminale dovrei andare a scrivere
Code:
fatt(numero_di_cui_voglio_il_fattoriale, N)
dove N in questo caso è una variabile (visto che in prolog tutte le variabili vengono indicate con la lettera maiuscola).
Il problema sorge quando tento di richiamare questa funzione all'interno di un'altra funzione, in questo modo :

Code:
fattoriale (N):-
fatt(N,M).


l'errore datomi dal compilatore è questo:
Code:
Syntax error: Operator expected

di quale operatore parla?? cosa si aspetterebbe?? ...
mentre a runtime, se scrivo questa riga da terminale:
Code:
fattoriale(4).
mi dà questo tipo di errore:
Code:
ERROR: toplevel: Undefined procedure: fattoriale/1 (DWIM could not correct goal)
qualcuno mi saprebbe dire dove sta il problema? ... testate testate
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #1 on: 28-08-2014, 21:41:52 »

fattoriale (N):-
fatt(N,M).

ma come fai a recuperare il valore del fattoriale?

FB
Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #2 on: 29-08-2014, 09:15:19 »

effettivamente non ci avevo pensato ... mea culpa  testate
 e quindi in questo caso come faccio a creare una funzione di ordine superiore con un solo parametro di input ? ...
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #3 on: 29-08-2014, 17:38:31 »

effettivamente non ci avevo pensato ... mea culpa  testate
 e quindi in questo caso come faccio a creare una funzione di ordine superiore con un solo parametro di input ? ...

Quale sarebbe la funzione "di ordine superiore"Huh?

Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #4 on: 30-08-2014, 11:26:25 »

intendevo dire che invece di usare una funzione con 2 parametri, utilizzavo la funzione in modo tale da prendere un solo parametro. In questo senso era una funzione di ordine superiore...nel senso che era ad un più alto livello rispetto a dare 2 parametri in input. Parametri che magari l'utente non vorrebbe vedere ... non so forse sono ancora troppo legato a java ...per esempio nella funzione che lei ha fatto per la colorazione delle mappe, ad un certo punto riuscivamo a farci restituire quali tra tutte le colorazioni presenti tra "i fatti" era quella che non creava conflitti. Ecco in questa funzione per esempio, sbaglio o l'output viene dato in maniera diversa rispetto al fattoriale? ...forse sono un po' confuso magari ...  testate
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #5 on: 30-08-2014, 19:13:06 »

Una funzione e' di ordine superiore se prende in input funzioni e/o restituisce in output funzioni.
Non mi pare il caso presente.

Troppo Java rovina l'elasticita' mentale....   

FB
Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #6 on: 31-08-2014, 11:03:25 »

credo proprio di sì   cry
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #7 on: 31-08-2014, 11:32:02 »

Il fatto e' che in Prolog una funzione e' rappresentata realmente per quello
che e' in matematica, cioe' una relazione binaria.
E una relazione binaria e' vista come un predicato binario.

fattoriale (N)  e' invece un predicato unario, cioe' un sottoinsieme, e non un
sottoinsieme di coppie (quel che e' una relazione binaria).

FB
Logged
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #8 on: 31-08-2014, 12:18:04 »

capito  la ringrazio prof! 

per quanto riguarda invece il salvare l'output restituito da una funzione, invece come è possibile farlo ? Mi spiego meglio.

io vorrei fare una funzione di questo tipo:
Code:
/*fare una funzione ricorsiva che mi restituisca,oltre al fattoriale del numero, la lista delle chiamate ricorsive fatte dalla funzione fattoriale
esempio:
stack_fatt(5,M,Stack).
M=120,
Stack=[1,1,2,6,24,120]. */

stack_fatt(0,1,[1]):-!.
stack_fatt(N,F,Stack):-M is N-1,
fatt(M,K),
F is N*K,
append([F],Stack,Stack).


/*funzione che, date 2 liste,mi restituisce una lista che è l'append delle 2!
esempio:
append([1,2],[3,4,5],X).
X = [1, 2, 3, 4, 5].
'*/
append([X|Y],Z,[X|W]) :- append(Y,Z,W).
append([],X,X).

quello che succede nel terminale è questo e non ne capisco il perchè ...
Code:
stack_fatt(5,N,Stack).
N = 120,
Stack = [120|**].

per quale motivo Stack non mi compare come vorrei? ... dove sta l'errore e cosa dovrei modificare per risolvere il problema? ... testate testate
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #9 on: 03-09-2014, 15:57:45 »

L'errore credo che sia nell'append perché tu 'assegni' alla variabile Stack la vecchia lista Stack + il nuovo elemento inserito, mentre si dovrebbe ricreare una nuova lista.

Io l'ho riscritto in questa maniera. Non è stato semplice scriverlo ed inoltre i risultati non vengono restituiti, ma bensì li stampo alla fine! boh

Code:
% Applicazione: il programma calcola il fattoriale
% di un numero iniziando sempre da 1:
% Esempio: fact(5) = 1*2*3*4*5

% Fattoriale di 0
stack_fact(_,0,1,[1]) :- !.

% Se arrivo a N+1 iterazioni, stampo ed esco...
stack_fact(T,N,M,Stack) :- T =:= N+1, write(M), nl, write(Stack),!.

% Caso base: inizializzo le variabili M e Stack sostanzialmente..
stack_fact(1,N,_,_) :- stack_fact(2,N,1,[1,1]),!.

% Parte ricorsiva
stack_fact(T,N,M,[Head|Tail]) :-
T =< N,
X is Head*T, % elemento da inserire nello Stack
append([X],[Head|Tail], New), % predicato di Prolog
F1 is T*M,
T1 is T+1,
stack_fact(T1,N,F1,New).
Logged

Diventa ciò che sei nato per essere
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #10 on: 03-09-2014, 22:30:09 »

mmm ma la funzione append l'ho provata sulle liste e funziona alla grande ... e poi io alla funzione append dò 3 parametri: 2 liste che devono essere concatenate e la lista che è la concatenazione delle 2 ! Quest'ultima lista sarà poi quella che verrà ritornata dalla funzione, no?  quindi dove starebbe il problema ? e poi quello di cui avevo bisogno era capire come si facesse a restituire una struttura dati da un metodo, non una stampa  cry
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #11 on: 04-09-2014, 09:29:15 »

mm non credo.
La tua funzione append è uguale a quella di default che ha Prolog.
Prova a mettere queste 2 query nell'interprete:
Code:
?- Stack = [4,5], append([1,2,3],Stack,Stack).
Code:
?- Stack = [4,5], append([1,2,3],Stack,AltraVariabile).

EDIT: A prescindere dall'uso di append, dal codice poi la funzione stack_fatt la richiami soltanto una volta (perché richiami la 'fatt'), quindi l'append la fai una volta sola.
« Last Edit: 04-09-2014, 10:00:31 by Crasher » Logged

Diventa ciò che sei nato per essere
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #12 on: 04-09-2014, 13:10:32 »

Mente sana, programmi sani.. testate

Code:
fatt(0,1,[1]) :-!.
fatt(1,1,[1,1]) :-!.

fatt(N,M,Stack) :-
N1 is N-1,
fatt5(N1,K,StackX),
M is N*K,
[H|T] = StackX,
X is N*H,
append([X],StackX,Stack).

Code:
?- fatt(5,M,Stack), reverse(Stack,Final).
M = 120,
Stack = [120, 24, 6, 2, 1, 1],
Final = [1, 1, 2, 6, 24, 120].
Logged

Diventa ciò che sei nato per essere
rox
Forumista
***
Offline Offline

Posts: 633


« Reply #13 on: 05-09-2014, 12:15:57 »

ok grazie!   (ti è scappato un "5 " richiamando fatt5 che è una funzione che non esiste  [Emoticon] Asd)
e se ci pensi non serve nemmeno il caso base per l'1 considerando che c'è il caso base per lo zero già 
Logged

Una macchina è in grado di lavorare come cinquanta uomini comuni, ma nessuna macchina può svolgere il lavoro di un uomo straordinario.
Pages: [1]   Go Up
Print
Jump to: