2013-04-28 4 views
1

Je suis nouveau à Prolog, et j'essaye d'écrire un petit programme qui donnera une phrase aléatoire d'un DCG.Prolog - DCG - phrase aléatoire

Mon idée précédente était d'utiliser findall/3 pour faire une liste de toutes les phrases possibles, puis d'utiliser random_member/2.

Il a travaillé pendant un certain temps, jusqu'à ce que la grammaire est devenu plus grand et je commençais à avoir des erreurs de pile à cause de la récursivité ...

je alors pensé à une autre façon: faire un ensemble de tous les termes possibles à une donnée moment, en appliquant random_member pour obtenir le prochain terme, appelez récursivement cette même fonction, jusqu'à ce que j'obtienne la liste vide ...

Mais comment puis-je obtenir un ensemble de toutes les réponses possibles à un prédicat incomplet? Et comment puis-je l'obtenir dans un mis?

Pour plus d'informations, mon DCG ressemble à ceci:

s --> pronoun(X), verb(X), location. 
pronoun(1) --> [i]. 
pronoun(2) --> [you]. 
verb(1) --> [am]. 
verb(2) --> [are]. 
location --> [here]. 
location --> [there]. 

Mon idée de la solution (où la liste est la liste des termes déjà concaténés):

createRandomSentence(List) :- 
    setof(H, s([List|[H|_]], []), Set), 
    random_member(Pick, Set), 
    append(List, [Pick], List2) 
    <recursive call (haven't figured out this one either yet)> 

...

Merci d'avance! :)

Répondre

1

Cela me semble une tâche. Je voudrais aborder avec une autre stratégie, à savoir l'insertion sélecteurs dans DCG où vous voulez discriminer les alternatives. Quelque chose comme

s --> pronoun(X), verb(X), location. 
pronoun(1) --> {this}, [i]. 
pronoun(2) --> [you]. 
verb(1) --> [am]. 
verb(2) --> [are]. 
location --> {this},[here]. 
location --> [there]. 

% here choice just between 2 
this :- random(0,2,1). 

qui donne

?- phrase(s,L). 
L = [i, am, there] ; 
L = [you, are, there]. 

?- phrase(s,L). 
L = [you, are, there]. 
+0

Je ne savais pas que cela était possible! Merci beaucoup ! – Clung

Questions connexes