2012-05-11 13 views
2

私は今プロローグのコードを作業しています。それは価値のあるコンパイルに近く、すべてのアイデアは固いと思われますので、コンパイルするとうまくいくはずです。それは、句のリストのためにデータベースファイルを参照し、それからそれが文から必要な情報を選び、データベースを適切に照会するユーザがクエリを待つプログラムですが、フローテイントが標準的な述語に存在しないと不平を言ってエラーを出すのは、これは愚かな質問かもしれませんが、これを調べてみても、誰かが私を助けてくれるならこの問題を解決する方法を見つけることができません正しい方向に私を指摘すれば、それは非常に高く評価されるだろう。 !ここFlowpatternは存在しません

がエラーを与えるコードのブロックです:コンパイラが文句を言うことを具体的なラインは、(STR、SYMB、STR)fronttokenさ

loop(STR):- 
      scan(STR,LIST), 
      filter(LIST,LISroT1), 
      pars(LIST1,LIST2), 
      fail. 

loop(STR):- STR >< "",readquery(L),loop(L). 

readquery(QUERY):-nl,nl,write("Query: "),readln(QUERY). 

scan(STR,[TOK|LIST]):- 
    fronttoken(STR,SYMB,STR1),!, 
    upper_lower(SYMB,TOK), 
    scan(STR1,LIST). 

、 任意のヘルプは感謝をapreaciatedされます!

+0

愚かな質問ですが、どこに定義されている 'fronttoken(_、_、_)'ですか? – Amadan

+0

いいえ、プロローグのプリセット述語ではありませんか? – user1388126

+0

ああ確かにそれかもしれない。私は非常に奇妙なProlog方言を使用しました:p – Amadan

答えて

1

私たちはコードの "ex [c] er [p] t"を見ているので、間違っていることを確かめるのは難しいですが、この証拠にはloop/1が呼び出されていますreadquery/1引数STRからloop/1にデータを書き込む(バインドする)ことができます。

loop/1は繰り返し(反復的に)呼び出され、繰り返し/失敗パターンで呼び出されます。しかし、初めてloop/1が実行されたとき、どのように引数STRが入力されるのかが示されたコードには表示されません。

(より自己完結型)明確なコードスニペットは次のようになります:

loop :- 
      readquery(STR), 
      scan(STR,LIST), 
      filter(LIST,LISroT1), 
      pars(LIST1,LIST2), 
      fail. 

loop :- loop. 

これは、それを明確に述語loopが実際にどんな結果を返さない(と与えられたコードスニペットが完了していないということになり全体としてプログラムが達成していることを明確にするのに十分な)。 failより前の節がloopであると仮定しているため、失敗した場合、制御はloop/0という2番目の(再帰的)節になります。これが当てはまらない場合は、各呼び出しをonce/1の中にラップすることによって決定論が強制される可能性があります。

+0

のコード 'scan(STR、[TOK | LIST]): - fronttoken(STR、SYMB、STR1)、!、' OPは 'fronttoken 'の前に' write(STR) "STR"は自由なvar "エラーです...これは、コードがASCII以外のいくつかのUnicodeコードを持つどこかからコピー貼り付けされたことを意味するだけで、上に入力する必要があります。 –

+0

@WillNess:壊れた「コード」タグを修正してくれてありがとう。私はOPの発言で 'write(STR)'を挿入して、 'fronttoken'が呼び出されたときに' STR 'の値が何であったかを見るためにコードを "装備"していました。 Unicode/ASCIIミックスアップをどのように示唆していますか? – hardmath

+0

私はそれがSWIの "Singleton variable"警告のようだと思った。 'p(X): - Y == 1 'とする。 –

関連する問題