2015-09-12 4 views
3

Я пытаюсь сделать программу, которая может найти самое длинное слово, которое вы можете сделать с заданным набором букв. (Вроде как Уотсон в опасности)Пролог: написать программу, такую ​​как Watson in Jeopardy

До сих пор мне удалось сделать так, что если вы укажете длину слова, это даст вам все слова этой длины, которые вы можете сделать с помощью букв, которые вы ему дали.

Программа содержит факты 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 

Это не выглядит, что трудно, но я просто не могу заставить его работать. Было бы здорово, если бы кто-то мог помочь или, может быть, указать мне в правильном направлении!

ответ

2

Проблема вы столкнулись можно разложить на два :

  1. Определить максимальную длину всех слов в словаре word/1.

    Это одноразовое усилие, которое требуется при изменении определения word/1.

  2. Перечислить все допустимые баллы - начиная с самого большого, а не с самого маленького.

    Использование length/2 и append/3 вы могли бы написать:

     
    ?- length(Ref,7), append(_,Part,Ref). 
        Ref = [_A,_B,_C,_D,_E,_F,_G], Part = [_A,_B,_C,_D,_E,_F,_G] 
    ; Ref = [_A,_B,_C,_D,_E,_F,_G], Part = [_B,_C,_D,_E,_F,_G] 
    ; Ref = [_A,_B,_C,_D,_E,_F,_G], Part = [_C,_D,_E,_F,_G] 
    ; Ref = [_A,_B,_C,_D,_E,_F,_G], Part = [_D,_E,_F,_G] 
    ; Ref = [_A,_B,_C,_D,_E,_F,_G], Part = [_E,_F,_G] 
    ; Ref = [_A,_B,_C,_D,_E,_F,_G], Part = [_F,_G] 
    ; Ref = [_A,_B,_C,_D,_E,_F,_G], Part = [_G] 
    ; Ref = [_A,_B,_C,_D,_E,_F,_G], Part = [] 
    ; false. 
    

 Смежные вопросы

  • Нет связанных вопросов^_^