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).

%% プログラムリストここまで

このQ&Aに関連する最新のQ&A

A 回答 (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引数不定なのでリストは決して[]になりません...ので
停止条件が満たされること無く無限ループになります。(^_^;

# いまだに、ぷろろーぐってのこってるんだ...なつかしい...

この回答への補足

 回答ありがとうございます。

 この場合、何かこれを回避する方法などあるのでしょうか。それとも、規則を書き換えないといけないのでしょうか。

補足日時:2001/05/15 16:08
    • good
    • 0

根本的に述語の記述をもう少し整理したほうが良いとは思うのですが、


対処療法としては、

> 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年は昔の記憶なので間違ってる所が
# あってもかんべんしてください。(-_^;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q[TeX,DVI,PS,PDF]

エラーが出て読み込めないepsファイルがあります。
どうすればいいでしょうか?
そもそも「endobj」とは何でしょうか?

** WARNING ** Didn't find "endobj".
** WARNING ** Failed to include image file "./421.eps"
** WARNING ** >>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]
** WARNING ** pdf: image inclusion failed for "421.eps".
** WARNING ** Failed to read image file: 421.eps
** WARNING ** Interpreting special command PSfile (ps:) failed.
** WARNING ** >> at page="17" position="(178.298, 728.302)" (in PDF)
** WARNING ** >> xxx "PSfile="421.eps" llx=16 lly=22 urx=797 ury=986 rwi=7810 "

●GSViewはEncapsulated Postscriptの仕様で定義された「一行が255文字以下」を満たしていないという理由を掲示した上で表示してくれたが、dvioutでは画像は表示されなかった。

●EPSファイルは、VisioのオブジェクトをAdobe Distiller Jにかまして作られたものだと思われる。
ここでエラーが出るせいなのかわからないが
このEPSファイルが貼り付けられたTeXファイルをコンパイルしたDVIではすべて前にある画像(JPEGをjpeg2psでPSに変換して作成)となっている。

こうして出来た(?)dviファイルをdvipdfmxに通して作られたPDFではそれらの画像(同様の方法を用いて作られたPSファイルを含む)は表示されているが、該当エラーが発生した画像は表示されなかった。

エラーが出て読み込めないepsファイルがあります。
どうすればいいでしょうか?
そもそも「endobj」とは何でしょうか?

** WARNING ** Didn't find "endobj".
** WARNING ** Failed to include image file "./421.eps"
** WARNING ** >>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]
** WARNING ** pdf: image inclusion failed for "421.eps".
** WARNING ** Failed to read image file: 421.eps
** WARNING ** Interpreting special command P...続きを読む

Aベストアンサー

>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]

それで確認しましたか?ここが最重要です.
endobj というのは読んで字のごとく,
オブジェクトの終端でしょう.
この手のエラーがでるのはEPSそのものが不正,
もしくはghostscriptがPDFに変換できないということで
はっきりいうとそのEPSに問題があるのです.

dvioutはEPSを表示する際にghostscriptを使うので
dvioutでも画像が表示できないということなら
ますますgsで変換できないものなのでしょう.
(注意:gsで変換できないのと表示できないは別のことです
gsで表示できるものが他の形式に変換できるかは別問題です)

visio由来のEPSはいろいろと問題を起こします.
大抵の場合はフォント周りで問題が発生します.

Ditillerをお持ちならdvipdfmxを使わなければ
うまくいくかもしれません

もしかするとghostscriptのバージョンをあげたりすると
うまくいくかもしれませんが・・・根本的には
EPSそのものを修正するしかありません.

>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]

それで確認しましたか?ここが最重要です.
endobj というのは読んで字のごとく,
オブジェクトの終端でしょう.
この手のエラーがでるのはEPSそのものが不正,
もしくはghostscriptがPDFに変換できないということで
はっきりいうとそのEPSに問題があるのです.

dvioutはEPSを表示する際にghostscriptを使うので
dvioutでも画像が表示できないということなら
ますますgsで変換できないものなの...続きを読む

Q[platex] description環境でのitemのオプション([]内)で]という文字を使うには?

\documentclass[12pt]{jreport}
\begin{document}

単位は[mm]のように鍵括弧でくくって書くことにします

\begin{description}
\item[5[cm]の時]{5[cm]の時と表示されるのが望んでいる動作。実際は先の括弧で終わったと解釈されてしまい、5[cmの時]となってしまう。
バックスラッシュを使おうとしても「Bad math environment delimiter.」というエラーが表示されてしまう。どうするのが正解か?}
\end{description}
\end{document}

Aベストアンサー

\item[5[cm]の時]

\item[5{[cm]}の時]
としてください。

Q[Oracle]と [PL/SQL]の違い

[Oracle]と [PL/SQL]の違いを
コンピュータの知識がまったくない人に教えたいのですが、
どうすればよいですか。

Aベストアンサー

[Oracle]とはオラクル社により提供されているデータベースです。
[PL/SQL]とは、そのデータベースへアクセスするための(オラクル社により開発された)言語です。
即ち、[PL/SQL]を使用することにより、[Oracle]へデータ(情報)を書き込んだり、取り出したりすることが出来ます。
これを倉庫に例えれば、[Oracle]が、倉庫であり、この倉庫に品物を格納し、必要があれば、そこから取り出します。そうすると、[PL/SQL]は、倉庫の管理人と考えることが出来ます。私たちは、倉庫の管理人に依頼して、倉庫に品物を保管してもらい、必要があれば、また、管理人に依頼して、その品物を取り出してもらいます。

Qverilog HDLの[=]と[<=]の使い分け

現在Verilog HDLを勉強しており、ひと通り勉強は終わりました。
しかしブロッキング代入[=]とノンブロッキング代入[<=]の使い分けをどこまで暗記すれば良いのか分かりません。
皆様は、[=]と[<=]の使い分け、あるいはネット型、レジスタ型への代入をする際の区別をどのように暗記していますか?「このポイントを理解すれば大丈夫!」みたいなことを教えていただけると助かります。

今思いつく例としては↓のとおりです
・assign文では[=]を使用しなければならない。
・assign文の左辺は[ネット型]のみ
・case文のHPによって[=]を使用しなければならない。
・ http://veri.jp/ba_nba.html のHPの最後のほうで『ほかにも「assign 文では NBA "<=" が使えません」という誤った注意書き』と書いてありますが、この記述の意味がわかりません。
・回路記述ではダメなのに、シミュレーション記述では問題がない等等、、、
他にもfunction文やalways文の中で式を書く時にも困っています。

Aベストアンサー

> http://veri.jp/ba_nba.html
こんな良い解説ページを見つけたのに、なぜ質問しているのかがよく分かりませんが・・・。

まずassign文は継続的代入であって、ブロッキング代入でもノンブロッキング代入でもないので、
ブロッキング代入とノンブロッキング代入の使い分けという議論の対象外です。

また、ブロッキング代入とノンブロッキング代入はレジスタ型に対して使う、
継続的代入はネット型に対して使う、
となるため、型でブロッキング代入とノンブロッキング代入の使い分けなんて言う議論は最初からできないです。(どちらもレジスタ型が相手だから)


解説ページにも書かれていますが、
ブロッキング代入とノンブロッキング代入の違いは、
"右辺の評価" と "左辺への代入" が同時に行われるか、別々に行われるかの違いです。

たとえば、
a = x;
b = a;
としたとき普通のプログラミング言語のように、bもxになって欲しいなら、ブロッキング代入を使いますし、
bにxが代入される前のaの値が入って欲しいなら、ノンブロッキング代入を使うことになります。


always文でFFを生成するときは、その時刻においては代入前の値を参照したい(実際の回路を考えると代入後の値を参照できるのは次のクロックがやってきたときだから)ので、
ノンブロッキング代入を普通は使いますね。
(ブロッキング代入だとレーシング=記述順序で結果が変わってしまうという問題があるというのもありますが。)

それ以外(組み合わせ論理を作るalways、function、シミュレーション記述)は、
特に理由がなければブロッキング代入を使っています(変数を直ちに更新して欲しい場合がほとんどだから)が、
前述のノンブロッキング代入の挙動を理解した上でノンブロッキング代入が必要だと思ったなら
使っていけないわけではないです。

> http://veri.jp/ba_nba.html
こんな良い解説ページを見つけたのに、なぜ質問しているのかがよく分かりませんが・・・。

まずassign文は継続的代入であって、ブロッキング代入でもノンブロッキング代入でもないので、
ブロッキング代入とノンブロッキング代入の使い分けという議論の対象外です。

また、ブロッキング代入とノンブロッキング代入はレジスタ型に対して使う、
継続的代入はネット型に対して使う、
となるため、型でブロッキング代入とノンブロッキング代入の使い分けなんて言う議論は最初からでき...続きを読む

Q[プログラミング][画像処理]勉強法をおしえてください

プログラミングを勉強しようと考えています。

学生時代(10年前)にC言語を習い、実験で使う簡単なプログラムを作ったことがある程度です(ちなみに情報系の学生ではなく機械系です)。簡単な文法をなんとなく覚えている程度でC++?? JAVA?? オブジェクト?? な感じです。

直近でやりたいことは...
「画像から複数の円を探して中心の距離を測定する」です。
それができたら、他にも色々とやってみたいと考えています。

少ししらべてみたのですが、
・画像を読み込んでハフ変換と処理をするプログラムを作ればいいらしい。
・ハフ変換をするソースコードは探せばいくらでもありそう。
・ただソースコードがあっても実行させるスキルはない。
・パラメータは自分でいじりたい。
・OpenCVというのを使えば、画像処理がいろいろできそう。

ImageJというフリーソフトを使えばなんとなく円を検出するこてゃできたのですが、
距離を測ったり、円以外のものを検出したりと、自分でソースコードをいじれるレベルにはなりたいで
す。

そこで何から手をつけたら良いのか教えて頂けないでしょうか。
まずはCを思い出すところから?
それともJAVAとか他の言語を基礎から勉強する?
それともOpenCVとやらをとりあえずインストールしてみる??

アドバイスを頂けないでしょうか。よろしくお願い致しますm(_ _)m

プログラミングを勉強しようと考えています。

学生時代(10年前)にC言語を習い、実験で使う簡単なプログラムを作ったことがある程度です(ちなみに情報系の学生ではなく機械系です)。簡単な文法をなんとなく覚えている程度でC++?? JAVA?? オブジェクト?? な感じです。

直近でやりたいことは...
「画像から複数の円を探して中心の距離を測定する」です。
それができたら、他にも色々とやってみたいと考えています。

少ししらべてみたのですが、
・画像を読み込んでハフ変換と処理をするプログラム...続きを読む

Aベストアンサー

ご自分で答えを出されていますよね。
まずはまったくの初心者のつもりで必要な言語を基礎から勉強しましょう。
昔少しかじったからなどと基礎をおざなりにすると、必ずあとで後悔します。
OpenCVだってライブラリなのですから基礎言語が理解できていなければ使えません。
ベテランSEでも基礎マニュアルを見直すことは欠かしませんので
自分がやりたいことを早く実現したい気持ちはわかりますが焦らず1から学びましょう。
中途半端に手を付けると、事あるたびにこうして質問サイトに投稿するハメになりますよ。


人気Q&Aランキング

おすすめ情報