めざましテレビ
昨日の早耳ムスメは JESSICA ちゃん,お題は「早耳ムスメのハマリもの! ジェシカ ver.」.
おっとぉ,この企画ボツになってなかったのか.
っていうか,JESSICA ちゃんは JESSICA ちゃんなのかジェシカちゃんなのかどっちなんだ!?
っていうか,月刊的には道端ジェシカちゃんですかそうですか.
ともあれ (JW),さすが JESSICA ちゃん,選ぶ服がどれも彼女らしいというか他のコには難しそうな感じ.
なんとか料理のお店では豪快な肉料理を食べていましたが,「1 週間分の肉料理を楽しむ」みたいに言っていたところからすると,肉料理を食べるのは 週一回だけ?
さすが,あのスタイルを維持しているだけのことはありますね.
Prolog 写経記 その 33 substitute_n/4
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
substitute_n/4
を写経します.解説
substitute_n(N, Y, List1, List2)
はList1
のN
番目の要素をY
に換えた新しいリストをList2
として返す.
ふむ.Java でいうと List#set(int, Object)
みたいな.
モード
substitute_n(?, ?, +, ?).
ふむ.変更前のリストだけは具体化して与えないといけないよ,と.
定義
では,こいつの定義を写経しませう.
substitute_n(N, Y, List1, List2) :- conc(L1, [_ | L2], List1), length(L1, M), N is M + 1, conc(L1, [Y | L2], List2).
やはり conc/3
のお世話に.
っていうか,なんか見たことあるなーって思ったら,delete_n/3
と限りなくそっくりじゃないですか.
delete_n(N, List1, List2) :- conc(L1, [_|L2], List1), length(L1, M), N is M + 1, conc(L1, L2, List2), !.
最後の conc/3
を呼び出す際に第 2 引数で Y
を付け加えていることが違うくらい.
N
番目の要素を削除してその位置に Y
を追加していると考えればそりゃそうだ.
もう一つ大きな違いは最後のカットの有無なんですが,そもそも delete_n/3
になぜカットが付いているのかよくわからなかったりします.
そんなわけで (どんなわけで?),delete_n/3
の時にカットを外してみたわけですが,動きは変わらなかったわけで.
なので,substitute_n/4
にカットを付けても構わないような?
例
では使用例を写経しませう.
2 ?- substitute_n(4, 9, [9, 9, 9, 8], L). L = [9, 9, 9, 9] Yes 3 ?- substitute_n(3, X, [ann, liz, sue], [ann, liz, kate]). X = kate Yes 4 ?- substitute_n(P, dave, [mike, paul, john], [dave, paul, john]). P = 1 Yes
ふむ.
では,最後にカットを付けてやってみますか.
6 ?- substitute_n(4, 9, [9, 9, 9, 8], L). L = [9, 9, 9, 9] Yes 7 ?- substitute_n(3, X, [ann, liz, sue], [ann, liz, kate]). X = kate Yes 8 ?- substitute_n(P, dave, [mike, paul, john], [dave, paul, john]). P = 1 Yes
ふむ.同じ結果.
カットがあってもなくても一緒じゃないかなぁ.
...
と思ったところで気づいちゃいました.カットの有無で動きが変わるケースがありますね.
まずはカットなし.
10 ?- substitute_n(N, 1, [1, 1, 1], [1, 1, 1]). N = 1 ; N = 2 ; N = 3 ; No
そしてカットあり.
12 ?- substitute_n(N, 1, [1, 1, 1], [1, 1, 1]). N = 1 ; No
こういう使い方に意味があるかどうか分かりませんが,N
が一つとは限らない場合に違いが出ますね.
うーん,ということは,delete_n/3
だってカットない方がいいんじゃないの?
13 ?- delete_n(N, [a, b, b, c], [a, b, c]). N = 2 ; No
N
は 2 だけじゃなくて 3 でも構わないはずでは?
カットが付いているからその解を見つけられないよ?
うーみゅ...
Inter 3 - 0 Lecce
\(^o^)/
出演予定 TV 番組
情報なしですぅ...