2016-03-19 18 views
2

私はいくつかの音節を合計したすべての単語の組み合わせをリストに入れようとしています。たとえば、2つの単語の組み合わせを返すhas_5_syllablesこの場合Prolog:合計X音節の単語のリストを取得する

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

?- has_5_syllables(X). 
X = [woman, family] ; 
X = [nature, family] ; 
X = [apple, family] ; 
... 

は、そこで問題は、それはまた、2つの以上の単語の組み合わせを返しますので、私は述語を拡張する方法、です、例えば[cat, boy, family], [cat, boy, pet, apple]?あなたが述語に音節の和としてNを渡すことができるように

理想的には私も、それは一般的な作りたい:has_n_syllables(L, N).

答えて

0

質問は、その後、同様であるため我々は、this answerからsubset_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は本当にセットされ、その引数を必要としない、だけで一覧表示されます...名前はsublist_listである必要があり、本当に...

+0

これは素晴らしい!正直言って私は非常に冗長な解決策を期待していましたが、 '' 'subset_set''の実装さえかなり軽いです。しかし、私はPrologにはとても新しいので、すべてが非常にあいまいです。何が起こっているのかを理解するためにいくつかのコメントを追加してもよろしいですか?ありがとう! – skamsie

+1

これはあいまいではありませんが、解空間の網羅的な検索です。 subset_set可能なすべての既知の単語の組み合わせを得るためのキーです。また、findallもシラバスの数を集めたので、単語を分けてカウンターを合計するだけで十分です。解空間全体を視覚化するために '' has_n_syllables(L、N)、writeln(L/N).'を試すことができますforallによって誘発されたバックトラックに印刷された各単語群の解があります。 – CapelliC

関連する問題