- ベストアンサー
質問 about Prolog
- Prologについて質問があります。
- Prologで簡易和英・英和翻訳機をつくろうとしていますが、途中で問題が発生しています。
- 英語から日本語への翻訳はできるのですが、日本語から英語への翻訳が無限ループしてしまいます。回避方法はあるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
この例だと、第1引数が不定の場合はひたすらリストに単語を追加して行くと いう動作をすると思います。 prep_phrase(A,[],[heya,no,naka,no],[]) prep([in|A],A,[naka|[no|[]]],[no|[]]) noun_phrase(A,[],[heya,no,naka,no],[no|[naka|[no[]]]]) noun([rooms|B],B,[heya,no,naka,no],[no,naka,no]) prep_phrase(B,[],[heya,no,naka,no],[heya,no,naka,no]) prep([in|A],A,[naka,no,heya,no,naka,no],[no,heya,no,naka,no]) このあと、nounはarg1,arg2ともに単語をリストの先頭に単語を追加するだけ なので成功します。その後再帰的にprep_phraseを呼び出しているのですが、 すでに、第1引数不定なのでリストは決して[]になりません...ので 停止条件が満たされること無く無限ループになります。(^_^; # いまだに、ぷろろーぐってのこってるんだ...なつかしい...
その他の回答 (1)
- h_hikita
- ベストアンサー率40% (104/257)
根本的に述語の記述をもう少し整理したほうが良いとは思うのですが、 対処療法としては、 > prep_phrase(A, C, X, Z):-prep(A, B, Y, [no|Z]), noun_phrase(B, C, X, [no|Y]). > prep_phrase(A, A, X, X). の部分を prep_phrase([],[],X,X). prep_phrase(A, C, X, Z):-prep(A, B, Y, [no|Z]), noun_phrase(B, C, X, [no|Y]). としたら止まりませんか?ちょっともう手元で処理系を使える環境に いないので確認はできません。ごめん。 # 昔はメモリーも少なかったんで、 # # 適宜 ! を使って不要なスタックをつぶす。 # unboundな変数は述語の最後の方の引数にすると良い。 # 可能なかぎりtail recursionを使う... # list よりは 述語を使う等。 # # とかしてたような...15年は昔の記憶なので間違ってる所が # あってもかんべんしてください。(-_^;
補足
回答ありがとうございます。 この場合、何かこれを回避する方法などあるのでしょうか。それとも、規則を書き換えないといけないのでしょうか。