2017-09-13 3 views
2
:-consult(words.pl). % words is basically a big database of the 
        % 30.000 most used words in the english language 

topsolution([], _, P) :- %basecase, in case the given list of letters is 
         %empty, output no word and give the amount of letters 
         %and call it P 
    word(X),    %sees if X is a word 
    P = 0. 
topsolution(WordList, X, P) :- %Makes the longest word it can out of a list 
           %of letters and outputs said word as X, and the 
           %amount of letters it has as P 
    Y = 0,       
    solution(WordList, X, Y), %Determines what words you can make with a given 
           %list of letters and a given length of said word 
    Y1 is Y + 1,    
    solution(WordList, X, Y1), %Determines the longest word of Y + 1 
    wordLength(P, X).   %Defines how many letters a word X has and calls that amount P 

これは私がその単語を見つけるために作ったコードです。私が苦労している唯一の問題は、再帰を止める方法を見つけることができないということです。私はそれがこれを行う理由を知っている与えられた文字のリストから可能な限り長い単語を見つける必要があります。PROLOG

Word = gig 
Y = 3 
true 

:現在、I入力場合:

?- topsolution([g,i,g], Word, Y). 

Prologの出力この:

false 

でも、それが出力するけれども。それは、YがY = 4に達するまで、Yが1ずつ増加し続けているからです。リストのうち3文字のみからなる4文字の可能な単語がないためです。明らかに失敗します。

これを修正することをお勧めしますか?単語を出力できない場合には、プロローグは基本的にどのように停止すべきだと伝えるのですか?

+0

'solution/3'のコードがなければ、これをデバッグすることは非常に難しいでしょう。 –

答えて

1

シングルトン値の警告のため、あなたのベースケースが非常に疑わしいはずです。 Prologのシングルトンはエラーとして扱うことが重要です。なぜなら、常にPrologとの誤解を表しているからです。

ここのあなたの基本ケースは間違っていると思います。 Prologが統一化に失敗すると、falseが出力されます。これは起こるはずのものです。 topsolution([g,g,g,g], Word, P)を呼び出すと、P = 0というよりも、falseと表示され、Wordは何も表示されません。解決策はありません。 P = 0と言うのは、「私は長さ0の解を見つけましたが、それが何であるかは分かりません」と言います。 「私は解決策を見いださなかった」と言う方がいいでしょう。

は、私はあなたが本当に2例があると思う:私は手紙の順列に基づいて単語を見つけ

  1. 私は右ここに持っているが、私は手紙のサブセットで1位を試みることによって単語を見つけ
  2. topsolution(Letters, Word, P) :- 
        permutation(Letters, WordLetters), % permute the letters 
        atom_chars(Word, WordLetters),  % make a permuted atom 
        word(Word),       % guard: it's a word 
        length(Letters, P).     % what's its length? 
    
    :私が手に持っていることは単語の文字の順列で、ここでの言葉だ:私はあなたのベースケースは実際に#1で右ここ

を持っています

その後、あなたの誘導の場合は、文字を取り除くと、もう一度試してみることです。

topsolution(Letters, Word, P) :- 
    select(_, Letters, RemainingLetters), % remove a letter 
    topsolution(RemainingLetters, Word, P). % try again 

あなたはシーケンス内のすべての文字を、すべての順列を排出した後、第2述語体を入力したとき、再帰が停止します。 select(_, [], _)はfalseです。したがって、ここで心配するのはP = 0です。

関連する問題