3

与えられた文字セットで作成できる最も長い単語を見つけるプログラムを作成しようとしています。(ジェパディのワトソンのようなもの)

これまでのところ、単語の長さを指定すると、指定した文字で作成できるその長さの単語がすべて表示されるように作成できました。

word/1プログラムには、次のように、考慮されたすべての英単語の事実が含まれています。

word(ant).  
word(computer).
% ... (and many more)

まず、述語word_letters/2のように、単語を文字のリストに変換するという述語を作成しましたatom_chars/2

次に、cover/2リストに前のリストのすべての文字が含まれているかどうかを確認する述語を作成しました。

cover([],[]).
cover([],_).
cover([Head1|Tail1],List2) :-
   member(Head1,List2),
   select(Head1,List2,Newlist),
   cover(Tail1,Newlist).

次にsolution/3、特定の長さのすべての単語を文字のリストに変換し、そのリストが最初に指定した文字でカバーされているかどうかを確認する述語を作成しました。

solution(Letters,Word,Length) :-
   word(Word),
   word_letters(Word,Letters2),
   length(Letters2,Length),
   word_letters(Word,Letters2),
   cover(Letters2,Letters).

私が今やろうとしているのは、単語の長さを指定する必要がないようにすることです。可能な限り長い単語を提供し、それがどれくらいの長さかを示す必要があります。次のように動作するはずです。

?- topsolution([g,i,g,c,n,o,a,s,t], Word, Score).
Word = agnostic,
Score = 8
True

それほど難しくないように見えますが、うまく機能させることができないようです。誰かが助けてくれたり、私を正しい方向に向けてくれたりしたら、それは素晴らしいことです!

4

1 に答える 1

3

あなたが直面している問題は、次の2 つに分解できます。

  1. word/1辞書内のすべての単語の最大長を決定します。

    word/1これは、定義が変更されるたびに必要となる 1 回限りの作業です。

  2. すべての許容スコアを列挙します — 最小のものからではなく、最大のものから始めます。

    を使用するlength/2と、次のappend/3ように書くことができます。

    ?- 長さ (Ref,7)、追加 (_、Part、Ref)。
      参照 = [_A、_B、_C、_D、_E、_F、_G]、部品 = [_A、_B、_C、_D、_E、_F、_G]
    ; 参照 = [_A、_B、_C、_D、_E、_F、_G]、部品 = [_B、_C、_D、_E、_F、_G]
    ; 参照 = [_A、_B、_C、_D、_E、_F、_G]、部品 = [_C、_D、_E、_F、_G]
    ; 参照 = [_A、_B、_C、_D、_E、_F、_G]、部品 = [_D、_E、_F、_G]
    ; 参照 = [_A、_B、_C、_D、_E、_F、_G]、部品 = [_E、_F、_G]
    ; 参照 = [_A、_B、_C、_D、_E、_F、_G]、部品 = [_F、_G]
    ; 参照 = [_A、_B、_C、_D、_E、_F、_G]、部品 = [_G]
    ; 参照 = [_A、_B、_C、_D、_E、_F、_G]、パーツ = []
    ; 間違い。
    
于 2015-09-12T21:37:24.200 に答える