Prolog 序言:获取总共包含X个音节的单词列表
我试图得到一个包含所有可能的组合词的列表,这些组合词总共有几个音节。例如:Prolog 序言:获取总共包含X个音节的单词列表,prolog,Prolog,我试图得到一个包含所有可能的组合词的列表,这些组合词总共有几个音节。例如: w(cat, noun, 1). w(boy, noun, 1). w(pet, noun, 1). w(eats, verb, 1). w(woman, noun, 2). w(nature, noun, 2). w(apple, noun, 2). w(watches, verb, 2). w(family, noun, 3). has_5_syllables(L) :- w(X, _, N0),
w(cat, noun, 1).
w(boy, noun, 1).
w(pet, noun, 1).
w(eats, verb, 1).
w(woman, noun, 2).
w(nature, noun, 2).
w(apple, noun, 2).
w(watches, verb, 2).
w(family, noun, 3).
has_5_syllables(L) :-
w(X, _, N0),
w(Y, _, N1),
plus(N0, N1, 5),
append([X], [Y], L).
在这种情况下,有5个音节
返回两个单词的组合:
?- has_5_syllables(X).
X = [woman, family] ;
X = [nature, family] ;
X = [apple, family] ;
...
问题是,我如何扩展谓词,使其同时返回两个以上单词的组合,例如[cat,boy,family],[cat,boy,pet,apple]
理想情况下,我也希望它是通用的,因此您可以将N作为音节的总和传递给谓词:
有N个音节(L,N)。
我们可以重用subset\u set/2,因为问题类似,那么findall/3可以构建一个成对的列表,从中我们可以轻松获得所需的解决方案:
has_n_syllables(L, N) :-
findall(W-S, w(W,_,S), WSs),
subset_set(Ps, WSs),
pairs_keys_values(Ps, L, Vs),
sumlist(Vs, N).
subset_set/2实际上并不要求其参数为集合,只是列出。。。名字应该是子列表,真的…太棒了!老实说,我期待一个超级详细的解决方案,但即使是
子集集
实现也非常简单。然而,我对Prolog非常陌生,一切似乎都非常模糊。你介意添加一些评论来了解那里发生了什么吗?谢谢它不是含糊不清的,而是对解空间的彻底搜索。子集集是获取所有可能的已知单词组合的关键,因为findall也收集了音节计数,所以将单词分开并对计数器求和就足够了。您可以尝试?-forall(有音节(L,n),writeln(L/n)。
来可视化整个解决方案空间。每组单词都有一个解决方案,打印在forall引起的回溯上。