与えられた文字セットで作成できる最も長い単語を見つけるプログラムを作成しようとしています。(ジェパディのワトソンのようなもの)
これまでのところ、単語の長さを指定すると、指定した文字で作成できるその長さの単語がすべて表示されるように作成できました。
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
それほど難しくないように見えますが、うまく機能させることができないようです。誰かが助けてくれたり、私を正しい方向に向けてくれたりしたら、それは素晴らしいことです!