2012-11-09 5 views
2

Pour en savoir un peu plus sur les expressions régulières dans Prolog, j'essaie d'écrire des fonctions qui déterminent si l'entrée correspond au motif; mes fonctions sont les suivantes:Expressions régulières dans Prolog

split(W, [[], W]). 

split([X|W], [[X|W1], W2]) :- split(W, [W1, W2]). 

match(eps, []). 
match(symb(A), [ A ]). 
match(union(R1, R2), W) :- match(R1, W). 
match(union(R1, R2), W) :- match(R2, W). 
match(conc(R1, R2), W) :- split(W, [W1, W2]), W1 \= [], W2 \= [], match(R1, W1), match(R2, W2). 
match(star(R), W)  :- match(R, eps). 
match(star(R), W)  :- split(W, [W1, W2]), W1 \= [], match(R, W1), match(star(R), W2). 

Je SWIPL entrer dans ce qui suit et obtenir les résultats suivants:

?- match(star(symb(a)),[a,a,a,a]). 
false. 

?- match(star(symb(b)),[b]). 
false. 

Pour autant que je peux dire, les autres fonctions fonctionnent correctement. Quelqu'un peut-il me dire où je me suis trompé avec la manipulation des étoiles?

Merci!

+1

Avez-vous tracé votre programme? – nhahtdh

+0

Notez que votre programme ne pourra pas faire correspondre la chaîne 'bbbbbb' avec regex' a * b'. Si vous avez appris à couper, vous pouvez également rendre la sortie du programme vraie et vraie sans passer par tous les autres cas possibles. – nhahtdh

+0

vous devriez vérifier certaines réponses avec la balise [DCG] – CapelliC

Répondre

0

Ah, peu importe je suis un imbécile. Je devais changer

match(star(R), W) :- match(R, eps). 

juste

match(star(R), []). 

Je continué à obtenir stackoverflows parce qu'il n'y avait aucun cas de base. Vivez et apprenez je suppose!

+0

Si elle renvoie false, il ne s'agit pas d'un stackoverflow. – nhahtdh