Самое длинное слово из заданного списка букв - PullRequest
0 голосов
/ 01 мая 2018

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

include('words.pl').

word_letters(Word, Letters) :- atom_chars(Word, Letters).

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

solution(ListLetters, Word, Length) :- word(Word), 
                                       word_letters(Word,LettersWord), 
                                       length(LettersWord, Length), 
                                       cover(LettersWord,ListLetters). 

topsolution(Letters, Word, LMax) :- solution(Letters, Word, LMax).
topsolution(Letters, Word, LMax) :- select(_, Letters, RemainingLetters), 
                                    topsolution(RemainingLetters, Word, LMax).

Предикат word_letters преобразует данное слово в список букв. Предикат обложки сообщает, включен ли данный список во второй список.

?-cover([a,b,c], [b, a, a, c])
true

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

Моя проблема связана с предикатом topsolution, который должен возвращать только решения самой большой длины, но вместо этого он работает как решение.

Не могли бы вы помочь мне понять, как я могу сделать topsolution, чтобы он выводил только слова с максимальной длиной?

Вот база данных моих слов: tinyurl.com/prolog-words

1 Ответ

0 голосов
/ 02 мая 2018

Я решил свою проблему, используя другой предикат.

topsolution(Letters, Word, Lmax) :- length(Letters, N1), 
                                    topsolutionCount(Letters, Word, Lmax, N1). 
topsolutionCount(_, _,_,0). 
topsolutionCount(Letters, Word, N, N) :- solution(Letters, Word, N). 
topsolutionCount(Letters, Word,Lmax, N) :- N1 is N-1, 
topsolutionCount(Letters, Word, Lmax, N1).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...