Forum Informatica Unict

LAUREA MAGISTRALE => Linguaggi di Programmazione, 9 CFU => Topic started by: Shin on 01-02-2014, 17:57:20



Title: Esercizio Prolog
Post by: Shin on 01-02-2014, 17:57:20
Scrivere un programma PROLOG che riconosca o rifiuti stringhe appartenenti al linguaggio regolare, sull'alfabeto {a,b,c}, associato alla seguente espressione regolare

abc*b + aa(bb)*c*

Per semplicita' rappresentiamo una stringa con una lista di atomi (aacb verra' rappresentata dalla
lista [a,a,c,b]).

La mia soluzione è questa, ma non sembra funzionare:

Code:
ps(str) :- ps(0, str).

ps(0, [a | str]) :- ps(1, str).
ps(1, [b | str]) :- ps(2, str).
ps(2, [c | str]) :- ps(2, str).
ps(2, [b | str]) :- ps(3, str).
ps(3, []).

ps(1, [a | str]) :- ps(4, str).
ps(4, [b | str]) :- ps(5, str).
ps(5, [b | str]) :- ps(4, str).
ps(4, [c | str]) :- ps(4, str).
ps(4, []).

chi mi sa dire il perchè?


Title: Re:Esercizio Prolog
Post by: SixArt on 01-02-2014, 18:07:47
Ma che errore ti da?
Io l'ho fatto nello stesso modo cambia solo il nome, però non l'ho mai provata..


Title: Re:Esercizio Prolog
Post by: Shin on 01-02-2014, 18:09:40
Ma che errore ti da?
Io l'ho fatto nello stesso modo cambia solo il nome, però non l'ho mai provata..

semplicemente non funziona... mi ritorna false anche su stringhe che dovrebbero essere valide... a te funziona?


Title: Re:Esercizio Prolog
Post by: Naive on 01-02-2014, 23:20:12
Come fai tu puoi accettare se non sbaglio e non ho fatto i passaggi errati anche una stringa del tipo aacbb


Title: Re:Esercizio Prolog
Post by: Naive on 01-02-2014, 23:46:11
Io l'ho risolto così che alla fine è simile al codice del professore

Code:
q0([a|Xs]) :- q1(Xs).

q1([b|Xs]) :- q2(Xs).

q1([a|Xs]) :- q4(Xs).

q2([c|Xs]) :- q2(Xs).

q2([b|Xs]) :- q3(Xs).

q3([]).

q4([b|Xs]) :- q5(Xs).

q4([c|Xs]) :- q6(Xs).

q4([]).

q5([b|Xs]) :- q4(Xs).


q6([c|Xs]) :- q6(Xs).

q6([]).

tuttavia ho un dubbio sono stato mezzora (di questo bel sabato sera) a capire il problema.
Se sposto il fatto
q1([a|Xs]) :- q4(Xs).
dopo il fatto
q3([]).
mi viene ritornato un errore, perché?


Title: Re:Esercizio Prolog
Post by: Shin on 02-02-2014, 10:01:12
sono stato mezzora (di questo bel sabato sera) a capire il problema.

penso che ora come ora siamo un po' tutti sulla stessa barca xD


Title: Re:Esercizio Prolog
Post by: Franco Barbanera on 02-02-2014, 14:58:39
Scrivere un programma PROLOG che riconosca o rifiuti stringhe appartenenti al linguaggio regolare, sull'alfabeto {a,b,c}, associato alla seguente espressione regolare

abc*b + aa(bb)*c*

Per semplicita' rappresentiamo una stringa con una lista di atomi (aacb verra' rappresentata dalla
lista [a,a,c,b]).

La mia soluzione è questa, ma non sembra funzionare:

Code:
ps(str) :- ps(0, str).

ps(0, [a | str]) :- ps(1, str).
ps(1, [b | str]) :- ps(2, str).
ps(2, [c | str]) :- ps(2, str).
ps(2, [b | str]) :- ps(3, str).
ps(3, []).

ps(1, [a | str]) :- ps(4, str).
ps(4, [b | str]) :- ps(5, str).
ps(5, [b | str]) :- ps(4, str).
ps(4, [c | str]) :- ps(4, str).
ps(4, []).

chi mi sa dire il perchè?

Francesco!!!
La pedata che non ti ho dato come rappresentante te la do' come studente!!!
ma dico io, quarda questa clausola:
ps(str) :- ps(0, str).
ps e' un predicato, ok, ma NON puo' essere contemporaneamente un predicato unario e binario!!

Correggi e dimmi come va.

FB


Title: Re:Esercizio Prolog
Post by: Shin on 02-02-2014, 15:05:30
Scrivere un programma PROLOG che riconosca o rifiuti stringhe appartenenti al linguaggio regolare, sull'alfabeto {a,b,c}, associato alla seguente espressione regolare

abc*b + aa(bb)*c*

Per semplicita' rappresentiamo una stringa con una lista di atomi (aacb verra' rappresentata dalla
lista [a,a,c,b]).

La mia soluzione è questa, ma non sembra funzionare:

Code:
ps(str) :- ps(0, str).

ps(0, [a | str]) :- ps(1, str).
ps(1, [b | str]) :- ps(2, str).
ps(2, [c | str]) :- ps(2, str).
ps(2, [b | str]) :- ps(3, str).
ps(3, []).

ps(1, [a | str]) :- ps(4, str).
ps(4, [b | str]) :- ps(5, str).
ps(5, [b | str]) :- ps(4, str).
ps(4, [c | str]) :- ps(4, str).
ps(4, []).

chi mi sa dire il perchè?

Francesco!!!
La pedata che non ti ho dato come rappresentante te la do' come studente!!!
ma dico io, quarda questa clausola:
ps(str) :- ps(0, str).
ps e' un predicato, ok, ma NON puo' essere contemporaneamente un predicato unario e binario!!

Correggi e dimmi come va.

FB

^__^"  grazie dell'aiuto prof, purtroppo però continua a darmi sempre false....


Title: Re:Esercizio Prolog
Post by: Naive on 02-02-2014, 15:30:43
L'errore dovrebbe essere che str è una variabile e quindi in prolog le variabili iniziano con le lettere maiuscole


Title: Re:Esercizio Prolog
Post by: Franco Barbanera on 02-02-2014, 15:38:15
L'errore dovrebbe essere che str è una variabile e quindi in prolog le variabili iniziano con le lettere maiuscole

Esatto!


Title: Re:Esercizio Prolog
Post by: Naive on 02-02-2014, 15:39:42
Professore potrebbe spiegarmi invece il dubbio che avevo io
Quote
Se sposto il fatto
q1([a|Xs]) :- q4(Xs).
dopo il fatto
q3([]).
mi viene ritornato un errore, perché?


Title: Re:Esercizio Prolog
Post by: Franco Barbanera on 02-02-2014, 15:50:33
Io l'ho risolto così che alla fine è simile al codice del professore

Code:
q0([a|Xs]) :- q1(Xs).

q1([b|Xs]) :- q2(Xs).

q1([a|Xs]) :- q4(Xs).

q2([c|Xs]) :- q2(Xs).

q2([b|Xs]) :- q3(Xs).

q3([]).

q4([b|Xs]) :- q5(Xs).

q4([c|Xs]) :- q6(Xs).

q4([]).

q5([b|Xs]) :- q4(Xs).


q6([c|Xs]) :- q6(Xs).

q6([]).

tuttavia ho un dubbio sono stato mezzora (di questo bel sabato sera) a capire il problema.
Se sposto il fatto
q1([a|Xs]) :- q4(Xs).
dopo il fatto
q3([]).
mi viene ritornato un errore, perché?

Non e' un errore, e' un warning.
Ti fa presente che le clausole che definiscono il predicato q1 sono sparpagliate
nel codice anziche' essere scritte tutte insieme.
Non e' un errore, ma e' uno stile di programmazione estremamente pericoloso,
che potrebbe crearti problemi nel capire come un programma funzioni o dove sia
un errore.

FB


Title: Re:Esercizio Prolog
Post by: Naive on 02-02-2014, 15:53:07
A ok grazie mille:)
buona domenica


Title: Re:Esercizio Prolog
Post by: Shin on 02-02-2014, 16:09:22
L'errore dovrebbe essere che str è una variabile e quindi in prolog le variabili iniziano con le lettere maiuscole

Giusto hai ragione, era questo il problema. Adesso funziona!


Title: Re:Esercizio Prolog
Post by: SixArt on 02-02-2014, 16:22:24
Quote
Francesco!!!
La pedata che non ti ho dato come rappresentante te la do' come studente!!!
ma dico io, quarda questa clausola:
ps(str) :- ps(0, str).
ps e' un predicato, ok, ma NON puo' essere contemporaneamente un predicato unario e binario!!

Correggi e dimmi come va.

FB

Prof se vuole dare la pedata a Francesco la può dare lo stesso non sono io che le voglio togliere questo piacere :D

però il predicato ps può essere contemporaneamente unario e binario infatti il mio codice funziona ed è proprio scritto con l'utilizzo dello stesso nome per una funzione unaria e binaria

Code:
parsing(String) :- parsing(0,String).

parsing(0,[a | Str]) :- parsing(1,Str).

parsing(1,[a | Str]) :- parsing(2,Str).
parsing(1,[b | Str]) :- parsing(3,Str).

parsing(2,[]).

parsing(3,[c | Str]) :- parsing(3,Str).
parsing(3,[b | Str]) :- parsing(4,Str).

parsing(4,[]).

quindi il problema era solo quello dell'utilizzo della variabile scritta tutta minuscola.


Title: Re:Esercizio Prolog
Post by: Shin on 02-02-2014, 16:24:09
Quote
Francesco!!!
La pedata che non ti ho dato come rappresentante te la do' come studente!!!
ma dico io, quarda questa clausola:
ps(str) :- ps(0, str).
ps e' un predicato, ok, ma NON puo' essere contemporaneamente un predicato unario e binario!!

Correggi e dimmi come va.

FB

Prof se vuole dare la pedata a Francesco la può dare lo stesso non sono io che le voglio togliere questo piacere :D

però il predicato ps può essere contemporaneamente unario e binario infatti il mio codice funziona ed è proprio scritto con l'utilizzo dello stesso nome per una funzione unaria e binaria

Code:
parsing(String) :- parsing(0,String).

parsing(0,[a | Str]) :- parsing(1,Str).

parsing(1,[a | Str]) :- parsing(2,Str).
parsing(1,[b | Str]) :- parsing(3,Str).

parsing(2,[]).

parsing(3,[c | Str]) :- parsing(3,Str).
parsing(3,[b | Str]) :- parsing(4,Str).

parsing(4,[]).

quindi il problema era solo quello dell'utilizzo della variabile scritta tutta minuscola.


confermo!!! forse colpa dell'implementazione di prolog SWI-Prolog? xD


Title: Re:Esercizio Prolog
Post by: Franco Barbanera on 02-02-2014, 16:58:08
Quote
Prof se vuole dare la pedata a Francesco la può dare lo stesso non sono io che le voglio togliere questo piacere
Si, per favore, lo sai che ci tengo troppo   .smile


Quote
però il predicato ps può essere contemporaneamente unario e binario infatti il mio codice funziona ed è proprio scritto con l'utilizzo dello stesso nome per una funzione unaria e binaria

Terribile. Non ci sono piu' gli interpreti di una volta....

Mi considero autopedatato!   :-)|

FB