Prolog - DCG - 随机句

时间:2013-04-28 17:19:10

标签: random prolog dcg

我是Prolog的新手,我正在尝试编写一个小程序,它将从DCG中随机判断。

我之前的想法是使用findall / 3来列出所有可能的句子,然后使用random_member / 2.

它工作了一段时间,直到语法变大,我因为递归而开始出现堆栈错误......

然后我想到了另一种方法:在给定时刻制作一组所有可能的术语,应用random_member来获得下一个术语,递归调用同一个函数,直到我得到空列表...

但是,如何才能获得一组不完整谓词的所有可能答案?我怎样才能在设置中获得它?

有关信息,我的DCG如下所示:

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

我对解决方案的想法(其中List是已连接术语的列表):

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)>

...

提前致谢! :)

1 个答案:

答案 0 :(得分:1)

对我来说似乎是一项任务。我会用另一种策略解决它,即在DCG中插入选择器,你需要区别对待。像

这样的东西
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).

产生

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

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