Prolog 写経記 その 53 abs/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
abs/2
を写経します.実は昨日の
fac/2
よりも abs/2
の方が前なのですが,見落としてました...心より恥じる.
解説
abs(X, Abs)
はX
の絶対値を返すか,あるいはAbs
がX
の絶対値かどうかを調べる.
ふむ.
モード
abs(+, ?).
ふむ.
定義
では,こいつの定義を写経しませう.
abs(X, X) :- X >= 0, !. abs(X, Abs) :- Abs is -X, !.
ふむ.
例
では使用例を写経しませう.
3 ?- abs(-27.5, X). X = 27.5 Yes 4 ?- abs(110, -110). Yes
あれれ?
2 番目の例,写経本では冷たく No
と言われることになっているんですけど?
110 の絶対値が -110 だなんてそんなはずは...
うーみゅ,この定義はちょっとイマイチですね.
abs(X, X) :- X >= 0, !.
2 番目の例では X
は 0 以上で,わざわざカットも付いているので次の節は評価されないことを意図しているように見えなくもないのですが,実はそれ以前に第 1 引数と第 2 引数を同一化できないため,このケースではカットは働きませんね.
そして
abs(X, Abs) :- Abs is -X, !.
こちらにはガードがないので -X
が絶対値として求められてしまう,と.
ダメじゃん...
そんなわけで (どんなわけで?),こんな感じかなぁ.
abs(X, Abs) :- X >= 0, !, Abs is X. abs(X, Abs) :- Abs is -X, !.
その結果.
9 ?- abs(-27.5, X). X = 27.5 Yes 10 ?- abs(110, -110). No
いい感じ♪
Re: hibernateを利用してはいけない5つのシチュエーション
ひがさんから頂いたコメント.
MagazineにModelが既に関連付けられている場合に、Magazine経由でModelを触ったときに触る(関連をたどる)だけで更新されるって意味なのかなぁと、おいらは、勝手に脳内補完してました。
そんなわけで (どんなわけで?),ひがさん脳内補完のケースがどうなるかを検証.
こういうコードでいいんですよね?
Transaction tx = session.beginTransaction(); Magazine magazine = (Magazine) session.createQuery("from hoge.Magazine").list().get(0); Model model = (Model) magazine.getModels().iterator().next(); model.setFirstName("Eri"); tx.commit();
Magazien
から Model
をたどって,その Model
を更新しています.
実際に発行された SQL.
Hibernate: select magazine0_.id as id, magazine0_.title as title1_ from Magazine magazine0_ Hibernate: select models0_.contract as contract1_, models0_.id as id1_, models0_.id as id0_, models0_.firstName as firstName0_0_, models0_.lastName as lastName0_0_, models0_.contract as contract0_0_ from Model models0_ where models0_.contract=? Hibernate: update Model set firstName=? where id=?
Magazine
は更新されていませんね.
そんなわけで (どんなわけで?),やはり元記事の著者がどんな状況で
hibernateでTransactionを使用すると、同一Transaction内でセレクトした全てのオブジェクトをTransactionコミット時に勝手に更新します。
と言っているのか,わけが分からないままです〜.
一応,元記事の方に バックトラック トラックバック送ってるのですが (今日のこれも送ります),元記事の著者さん気づいてるかなぁ?
気づいていたら,詳しい説明サンプル付きでプリーズ!!
P.S.
なんか,遅延ロードの SQL が Hibernate 2.x と変わってますね...
なんで SELECT 句に contract
を 2 回,id
に至っては 3 回も並べているのだろう?
不思議です...
04:00 追記
なんか,トラックバックが失敗する...
昨日はちゃんと送れたんですけどねぇ.
あちらのページを見ると,昨日トラックバックした際には文字化けしていたのが今は直っているので,その辺の影響でしょうか?
それならそれで著者の方も気づいてくれてるだろうから別にいいのですが.