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

您面临的问题可以分解为两个

  1. 确定word/1字典中所有单词的最大长度。

    这是一项一次性的工作,每当定义word/1更改时都需要这样做。

  2. 列举所有可接受的分数——从最大的分数开始,而不是最小的分数。

    使用length/2append/3你可以写:

    ?- 长度(参考,7),附加(_,部分,参考)。
      参考 = [_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 回答