Я пытаюсь сделать программу, которая может найти самое длинное слово, которое вы можете сделать с заданным набором букв. (Вроде как Уотсон в опасности)Пролог: написать программу, такую как 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
Это не выглядит, что трудно, но я просто не могу заставить его работать. Было бы здорово, если бы кто-то мог помочь или, может быть, указать мне в правильном направлении!