Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 序言:获取总共包含X个音节的单词列表_Prolog - Fatal编程技术网

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引起的回溯上。