Pages: [1] 2   Go Down
Print
Author Topic: Esercizio Prolog  (Read 3037 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Shin
Forumista
***
Offline Offline

Gender: Male
Posts: 822

Io sono ciò che sono per ciò che siamo tutti


WWW
« 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è?
Logged

"Il peggiore analfabeta è l’analfabeta politico. Egli non sente, non parla, nè s’importa degli avvenimenti politici. Egli non sa che il costo della vita, il prezzo dei fagioli, del pesce, della farina, dell’affitto, delle scarpe e delle medicine dipendono dalle decisioni politiche.

L’analfabeta politico è così somaro che si vanta e si gonfia il petto dicendo che odia la politica.

Non sa, l’imbecille, che dalla sua ignoranza politica nasce la prostituta, il bambino abbandonato, l’assaltante, il peggiore di tutti i banditi,
che è il politico imbroglione, il mafioso corrotto, il lacchè delle imprese nazionali e multinazionali."

(Bertolt Brecht)

Collettivo SDAI: collettivosdai.altervista.org, facebook.
Movimento Studentesco Catanese: www.movimentostudentesco.org

https://github.com/ShinDarth
http://shinworld.altervista.org
http://www.openprogrammers.it

LinuxMint user.
SixArt
Matricola
*
Offline Offline

Gender: Male
Posts: 51



« Reply #1 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..
Logged
Shin
Forumista
***
Offline Offline

Gender: Male
Posts: 822

Io sono ciò che sono per ciò che siamo tutti


WWW
« Reply #2 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?
Logged

"Il peggiore analfabeta è l’analfabeta politico. Egli non sente, non parla, nè s’importa degli avvenimenti politici. Egli non sa che il costo della vita, il prezzo dei fagioli, del pesce, della farina, dell’affitto, delle scarpe e delle medicine dipendono dalle decisioni politiche.

L’analfabeta politico è così somaro che si vanta e si gonfia il petto dicendo che odia la politica.

Non sa, l’imbecille, che dalla sua ignoranza politica nasce la prostituta, il bambino abbandonato, l’assaltante, il peggiore di tutti i banditi,
che è il politico imbroglione, il mafioso corrotto, il lacchè delle imprese nazionali e multinazionali."

(Bertolt Brecht)

Collettivo SDAI: collettivosdai.altervista.org, facebook.
Movimento Studentesco Catanese: www.movimentostudentesco.org

https://github.com/ShinDarth
http://shinworld.altervista.org
http://www.openprogrammers.it

LinuxMint user.
Naive
Matricola
*
Offline Offline

Posts: 57


Impossible is Nothing


« Reply #3 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
Logged
Naive
Matricola
*
Offline Offline

Posts: 57


Impossible is Nothing


« Reply #4 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é?
Logged
Shin
Forumista
***
Offline Offline

Gender: Male
Posts: 822

Io sono ciò che sono per ciò che siamo tutti


WWW
« Reply #5 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
Logged

"Il peggiore analfabeta è l’analfabeta politico. Egli non sente, non parla, nè s’importa degli avvenimenti politici. Egli non sa che il costo della vita, il prezzo dei fagioli, del pesce, della farina, dell’affitto, delle scarpe e delle medicine dipendono dalle decisioni politiche.

L’analfabeta politico è così somaro che si vanta e si gonfia il petto dicendo che odia la politica.

Non sa, l’imbecille, che dalla sua ignoranza politica nasce la prostituta, il bambino abbandonato, l’assaltante, il peggiore di tutti i banditi,
che è il politico imbroglione, il mafioso corrotto, il lacchè delle imprese nazionali e multinazionali."

(Bertolt Brecht)

Collettivo SDAI: collettivosdai.altervista.org, facebook.
Movimento Studentesco Catanese: www.movimentostudentesco.org

https://github.com/ShinDarth
http://shinworld.altervista.org
http://www.openprogrammers.it

LinuxMint user.
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #6 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
Logged
Shin
Forumista
***
Offline Offline

Gender: Male
Posts: 822

Io sono ciò che sono per ciò che siamo tutti


WWW
« Reply #7 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....
Logged

"Il peggiore analfabeta è l’analfabeta politico. Egli non sente, non parla, nè s’importa degli avvenimenti politici. Egli non sa che il costo della vita, il prezzo dei fagioli, del pesce, della farina, dell’affitto, delle scarpe e delle medicine dipendono dalle decisioni politiche.

L’analfabeta politico è così somaro che si vanta e si gonfia il petto dicendo che odia la politica.

Non sa, l’imbecille, che dalla sua ignoranza politica nasce la prostituta, il bambino abbandonato, l’assaltante, il peggiore di tutti i banditi,
che è il politico imbroglione, il mafioso corrotto, il lacchè delle imprese nazionali e multinazionali."

(Bertolt Brecht)

Collettivo SDAI: collettivosdai.altervista.org, facebook.
Movimento Studentesco Catanese: www.movimentostudentesco.org

https://github.com/ShinDarth
http://shinworld.altervista.org
http://www.openprogrammers.it

LinuxMint user.
Naive
Matricola
*
Offline Offline

Posts: 57


Impossible is Nothing


« Reply #8 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
Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #9 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!
Logged
Naive
Matricola
*
Offline Offline

Posts: 57


Impossible is Nothing


« Reply #10 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é?
Logged
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 3.079



WWW
« Reply #11 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
Logged
Naive
Matricola
*
Offline Offline

Posts: 57


Impossible is Nothing


« Reply #12 on: 02-02-2014, 15:53:07 »

A ok grazie mille:)
buona domenica
Logged
Shin
Forumista
***
Offline Offline

Gender: Male
Posts: 822

Io sono ciò che sono per ciò che siamo tutti


WWW
« Reply #13 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!
Logged

"Il peggiore analfabeta è l’analfabeta politico. Egli non sente, non parla, nè s’importa degli avvenimenti politici. Egli non sa che il costo della vita, il prezzo dei fagioli, del pesce, della farina, dell’affitto, delle scarpe e delle medicine dipendono dalle decisioni politiche.

L’analfabeta politico è così somaro che si vanta e si gonfia il petto dicendo che odia la politica.

Non sa, l’imbecille, che dalla sua ignoranza politica nasce la prostituta, il bambino abbandonato, l’assaltante, il peggiore di tutti i banditi,
che è il politico imbroglione, il mafioso corrotto, il lacchè delle imprese nazionali e multinazionali."

(Bertolt Brecht)

Collettivo SDAI: collettivosdai.altervista.org, facebook.
Movimento Studentesco Catanese: www.movimentostudentesco.org

https://github.com/ShinDarth
http://shinworld.altervista.org
http://www.openprogrammers.it

LinuxMint user.
SixArt
Matricola
*
Offline Offline

Gender: Male
Posts: 51



« Reply #14 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 Cheesy

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.
Logged
Pages: [1] 2   Go Up
Print
Jump to: