Prologについて質問があります。
私は今Prologで簡易和英・英和翻訳機をつくろうとしているのですが、途中でつまづいています。
以下のようなPrologリストを読み込んで、``in rooms''を日本語に直そうとして
:-prep_phrase([in,rooms], [], B, []).
と入力すると、
B = [heya,no,naka,no]
と正しい答が返ってきますが、逆に``heya no naka no''を英語に直そうと
:-prep_phrase(A, [], [heya,no,naka,no], []).
と入力しても、無限ループに陥ってしまうようでエラーメッセージとして
``stack overflow''
が返ってきます。
トレースしてみたところ、noun_phrase と prep_phrase が交互に次々と呼ばれていました。
どうしてこのようなことが起こるのでしょうか(英->和はできているのに)。また、これを回避する方法はあるのでしょうか。
%% プログラムリストここから
%% 英語の「名詞+前置詞節」を日本語の「前置詞節+名詞」に
%% 翻訳する
%% ex. in rooms -> heya no naka no
%% 名詞節
noun_phrase(A, C, X, Z):-noun(A, B, Y, Z), prep_phrase(B, C, X, Y).
%% 前置詞節
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([in|A], A, [naka|X], X).
%% 名詞
noun([rooms|A], A, [heya|X], X).
%% プログラムリストここまで
No.1ベストアンサー
- 回答日時:
この例だと、第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引数不定なのでリストは決して[]になりません...ので
停止条件が満たされること無く無限ループになります。(^_^;
# いまだに、ぷろろーぐってのこってるんだ...なつかしい...
この回答への補足
回答ありがとうございます。
この場合、何かこれを回避する方法などあるのでしょうか。それとも、規則を書き換えないといけないのでしょうか。
No.2
- 回答日時:
根本的に述語の記述をもう少し整理したほうが良いとは思うのですが、
対処療法としては、
> 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年は昔の記憶なので間違ってる所が
# あってもかんべんしてください。(-_^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 不定代名詞"no..."の否定語noの及び範囲について 4 2022/08/04 11:11
- 英語 A healthy 20 centimeters tall. に不定冠詞があるのはなぜでしょうか? 13 2022/10/07 05:13
- 英語 but の用法について 3 2023/03/01 13:16
- 英語 ニック先生の奇跡の応用法の「+α」の構成要素の統一性について 1 2022/04/30 15:43
- 英語 提示文の構造等について 2 2022/12/25 23:24
- 英語 英語文法の複合関係詞ついて質問です 2 2023/04/06 19:12
- 英語 英語の文法について複合関係詞の譲歩の用法について質問です 1 2023/04/01 19:21
- 英語 "over the edge"の修飾語句と位置について 5 2022/12/10 05:46
- 英語 A healthy 20 centimeters tall の a がなぜ定冠詞でないのでしょうか? 2 2022/10/14 05:21
- 英語 A healthy 20 centimeters tall の a がなぜ定冠詞でないのでしょうか? 2 2022/10/22 04:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
以下の内、どれでも良いので可...
-
サブウィンドウの大きさを複数...
-
window.openでフルスクリーン表...
-
JAVAでリンクボタンを作成して...
-
小窓を開くJSで、高さを調節し...
-
プログラミング初心者です
-
特定の時間帯だけ有効にする
-
小窓を表示する時に、必ず右上...
-
window.opener.location.href ...
-
<a href="#" …>の意味を教えて...
-
別ファイルのfunctionの読み込み方
-
function の return 値を表示し...
-
JavascriptとJqueryを混在し記述
-
jQueryでdivをクリックし別窓で...
-
(Javascript)印刷するファイル...
-
JavaScriptでiframeの内容を「...
-
base64encodeでの文字化けについて
-
相対パスと絶対パスの速度
-
bodyにidをつける理由は何ですか?
-
外部ファイル名を変数で指定で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
新しいウィンドゥを最大化で立...
-
SQLのWHEREで全てを質問する方法
-
小窓を表示する時に、必ず右上...
-
window.openでフルスクリーン表...
-
htmlファイルを開いた時の画面...
-
外部からのjs呼び出しについて。
-
町内会での不倫
-
IF文で該当の処理を通らない
-
Canvasを使って描画して面積取得
-
window.openの後にエンコードを...
-
色の指定で配列を使いたい
-
文字をクリックすると 小窓が開く
-
エクセルファイルをIE のウィン...
-
サブウインドウの高さを自動で...
-
window.open オートコンプリー...
-
HP作成の小窓リンクを作るには?
-
小窓を開くJSで、高さを調節し...
-
javascriptを別ファイルにして...
-
ポップアップ広告みたいな…
-
リンク先の別ウインドウをスク...
おすすめ情報