Учитывая список букв, я пытаюсь найти самое длинное слово, которое можно составить из этих букв.
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