1

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

...

提前致谢 !:)

4

1 回答 1

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].
于 2013-04-28T18:42:09.970 回答