Учитывая список букв, я пытаюсь найти самое длинное слово, которое можно составить из этих букв.
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
Предикат решения находит для заданного списка букв все слова, которые могут быть составлены из этих букв, и их длину.
Моя проблема связана с предикатом верхнего решения, который должен возвращать только решения с наибольшей длиной, но вместо этого он работает так же, как и решение.
Не могли бы вы помочь мне понять, как сделать верхнее решение, чтобы оно выводило только слова максимальной длины?
Вот моя база данных слов: tinyurl.com/prolog-words
Он не начинается с самого длинного слова.
Вы имеете ввиду :- include('words.pl').
?
К сожалению, topsolution/3
, как вы его определили, просто ничего не добавляет к тому, что делает solution/3
. Благодаря cover/2
, solution/3
уже пытается исключить все перестановки. Что вам нужно сделать в topsolution/3
, так это получить список результатов из solution/3
и найти самый длинный. Вероятно, используя findall/3
или setof/3
или bagof/3
.
Я решил свою проблему с помощью другого предиката. 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).
Пожалуйста, подумайте о том, чтобы представить это как решение и принять его, чтобы другие могли извлечь пользу из вашей работы!
Я решил свою проблему с помощью другого предиката.
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).
Вам просто нужно сделать
once(topsolution(...))
?