kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

アラン・ピーズ、バーバラ・ピーズ『自動的に夢がかなっていく ブレイン・プログラミング』

本屋でふと手に取ったこの本 

自動的に夢がかなっていく ブレイン・プログラミング

自動的に夢がかなっていく ブレイン・プログラミング

 

 『話を聞かない男、地図が読めない女』の人たちですね
詳しくは覚えてませんが納得しながら面白く読んだ記憶があります

最近この手の本はちょっと避け気味だったんですがなんとなく惹かれる
ものがあってKindleで買ってみました

内容はざっくりいうと信じたことは実現する系
『思考は現実化する』ですね
実はちょっとこういうのは苦手
「信じて進んだら成功しました!」というのを見ても生存者バイアスでしょ
みたいな見方をしてしまう方

ゴールを決めちゃうのにどうも抵抗があるんですよね 
肌が合わないと言うか
実現できなかったらどうしようって考えてしまう感じ
ちょっとずつやってたらいつのまにかこんなに進んでました、て方が
好みではあります

じゃあ何で買ってんの、というと
第一には題名にツボをつかれました
ベストセラーを何冊も出してる人はさすがにうまい、と思いかけましたが
原題は「The Answer」となっているので作者じゃなくて
サンマーク出版にしてやられた感

とは言え題名だけで買ったわけではなくて
信じれば実現する、のしくみや
どうすれば信じられるようになるか、という方法を説明して
くれそうだなってところ

そういう「しくみ」をうまく使って、ゴールを決めちゃうのが
苦手な人もいつのまにかゴールを決めちゃってる、みたいな
手法を紹介してくれるんじゃないかな―という期待

本書では、あなたが人生で心から望むことは何なのかをはっきりさせて、それを手に入れるための方法をお伝えする。

うんぜひぜひ 

自分は、信じれば実現するなんてありえない、と思ってるわけではなくて
脳がそういう性質を持ってるってのはありそうな話だなという感覚です
人混みでも自分の名前だけは聞こえるとか
自分の乗ってる車種の車はたくさん走ってるようにみえるとか
意識するとしないで見えるものがまったく違ってくるというのは
経験的にもわかります

そういうことをしてくれるのが「網様体賦活系」通称RASと呼ばれるものだそうです

この本には、「意志の力」のことなどは、いっさい書いていない。あくまでも、脳幹を通る細い神経線維──RASのことだけを書いた。

信じてやり抜け、とか言われると逃げたくなるのでぜひそうしてほしい

で、「プログラミング」というのは、自分のしたいことが実現した姿を
このRASに教え込むことということ

すると、騒音の中から自分を呼ぶ声だけを拾ってくれるように、
そのゴールの実現方法をRASが見つけてくれると言います
ここでのポイントは、方法を自分で考えようとしないこと
自分で考えようとすると、難しくてあきらめてしまうので

この本で言ってることは結局のところこれに尽きると思われます

RASへの教え込み方ですが、したいことを具体的に書き出してリストを作り、
特に実現したいものから期限を付け、常に見直して、実現した状態を
視覚化する、というもの

手書きがいいそうです
タイプして書くと指の動きは8種類だけど、手書きすると1万種類以上の
動きがあるから、よりRASに深く刻みつけられる、という理屈です
タイプで8種類・手書きで1万種類はちょっと数え方の基準が違うんじゃと
いう気がしなくもないですが

さっそくしたいことリストをと思って書き出してみたんですが何か違う
何が違うかと考えてみると「したいことリスト」じゃなくて
「(○○できるように)なりたいことリスト」になってました
なにかものごとを実現することより、実現する能力をつけたい、に寄りがち
ゴールを決めちゃうのが苦手なのと根っこは同じかもしれません
「なりたい」じゃダメとは書いてないですが、視覚化しやすいのは
きっと具体的なものごとの方でしょうね
まあいくつかは具体的なものも含まれてるのでいいことにします

ちょっと気になったのは、途中から「信じてやり抜く」とか
「決してあきらめない」みたいな書き方が出てきたこ

ミッチェルは「絶対に成功してやる」と決心した。これからの人生でどれほどの変化に見舞われ、どんな結果になろうとも、自分の意志で打ち勝ち、乗りこえてやると決意したのである。

それって「意志の力」じゃないのかな
そこは、RASをうまくプログラミングすれば、無意識のうちに
やり抜くようになってますよ的な説明で徹底してほしかった
途中で読むのがちょっとつらくなりかけてました
ただ、最後の方でRASにおまかせ路線に戻ったのでちょっと安心

買っちゃった理由その2は、「信じる」のはちょっと苦手だけど
「小さな習慣」方式と組み合わせて「小さく信じる」から始めたら
うまくいくかも?と思ったから

大きい目標は小さく分割して、みたいなことは書いてあるんですが、
もう1段上のレイヤーで小さく信じて少しずつ慣れていくみたいな
ことはできそうな気がするんで

ざざっと読んでみて、読む前の期待の充足度は6割くらい
もう一度くらいは読んでみてどう取り入れるか考えてみます
リストを手書きしてRASに刻み込む、という部分だけ取り出しても
それなりに使えるのかな―という気分

ところでこういう本って、読んだ感想は見つかるんですが
何ヶ月かやってみたらこうなりました、ってのがなかなか
見つからないんですよね
実際やってる人ってあんまりいないんですかね
それともやってみたけど書きたいほどの結果が出ないのか
やったけどダメだったよ!みたいなのでも読んでみたい気はするんですが
そうなったとき自分が書くかというと微妙ではあります
(ネタがなければ書くかも)

ゲーデルの不完全性定理の証明のアレをRacketで書いてみる (13)

「10.8.4 変数・記号・論理式」の続き

さて前回、勘違いに気づくまではもっと高速化しないとと思って
素因数分解する版を書き始めてました
乗った船なので続けてみます

素因数分解は12を((2 . 2) (3 . 1))と表現してみました
((0 . 0))というのは0とか1を因数分解しようとしたり
0番目の素因数を参照したりした時の値として使っています
ゲーデルの関数はそういった場合に0を返すようになっていて、
これでうまくいくんじゃないかと
あちこちにifを入れるよりさっぱりしそうなのでこうしてみました
かえってわかりにくくしてるかもなー

(define (times-divide x p)
  (let loop ((k 1) (x x))
    (cond ((not (CanDivide x p)) (values x (- k 1)))
          (else (loop (+ k 1) (/ x p))))))

; 0や1を与えられることもあるので場合分けして対応
(define (factorization x)
  (if (or (= x 0) (= x 1))
      '((0 . 0))
      (let loop ((n 1) (x x) (f '()))
        (if (= x 1)
            (reverse f)
            (let*-values (((pn) (P n))
                          ((x k) (times-divide x pn)))
              (loop (+ n 1)
                    x
                    (if (= k 0)
                        f
                        (cons (cons pn k) f))))))))

; 素因数分解した結果を扱うための関数たち

;こう書きたいところだが例外ケースを扱う必要がある
;(define factor-length length)
;(define (factor-nth f n) (list-ref f (- n 1)))

(define (factor-length f)
  (if (equal? f '((0 . 0)))
      0
      (length f)))

(define (factor-nth f n)
  (cond ((null? f) '(0 . 0))
        ((= n 1) (car f))
        (else (factor-nth (cdr f) (- n 1)))))

(define factor-prime car)
(define factor-expt cdr)

(define (IsNthType x n)
  (cond ((= n 1) (IsNumberType x))
        ((not (= (len x) 1)) #f)
        (else (let ((f (factorization (elm x 1))))
                (and (= (factor-length f) 1)
                     (> (factor-prime (car f)) crp)
                     (= (factor-expt (car f)) n))))))

せっかく素因数分解するならもっと遡って書き替えたくなります
いくつかの関数は簡単になります

(define (prime n x)
  (factor-prime (factor-nth (factorization x) n)))

(define (elm x n)
  (factor-expt (factor-nth (factorization x) n)))

(define (len x)
  (factor-length (factorization x)))

しかしこれでは実は速くなってないはず
**の中でelmを連続して呼ぶような場合、毎回素因数分解してるので
素因数分解の結果を覚えておくようにします

やりかたはPのときと同じ

(define factorizations (make-hash))
(hash-set! factorizations 0 '((0 . 0)))
(hash-set! factorizations 1 '((0 . 0)))

(define (factorization x)
  (cond ((hash-ref factorizations x #f))
        (else
         (let loop ((n 1) (x1 x) (f '()))
           (if (= x1 1)
               (let ((f (reverse f)))
                 (hash-set! factorizations x f)
                 f)
               (let*-values (((pn) (P n))
                             ((x1 k) (times-divide x1 pn)))
                 (loop (+ n 1)
                       x1
                       (if (= k 0)
                           f
                           (cons (cons pn k) f)))))))))

これで速くなったかもしれません
でもわかりません
計ってないから!

あと全部覚えておくのではいつかメモリが足りなくなりますね
まあそのときはそのときで

factorizationPで同じようなことを書いてますがマクロで書けるでしょうか

ゲーデルの不完全性定理の証明のアレをRacketで書いてみる (12)

「10.8.4 変数・記号・論理式」の続き

定義18 "第n型の記号"である

(define (IsNthType x n)
  (or (and (= n 1) (IsNumberType x))
      (and (> n 1) (∃ v ≦ x (and (IsVarType v n) (= x (<> v)))))))

さて高速化
もともと、#tが帰るようなときは遅くないんですがそうでないときはダメ
fx1ですらゲーデル数は1033121304になりますので
全部の数を試してるわけにはいきません

素数だけを試すようにします

(define (IsNthType x n)
  (cond ((= n 1) (IsNumberType x))
        (else
         (let ((e (elm x 1)))
           (let loop ((k 7))
             (let ((v (expt (P k) n)))
               (cond ((> v e) #f)
                     ((= v e) #t)
                     (else (loop (+ k 1))))))))))

どうもこういう繰り返しっぽい形でしか書けないのは頭が手続き型なんでしょうか

xが列なことを忘れて記号のつもりで書いてて勘違いに気が付かず
手間取ってしまったのでここまで

プリンキピアからのニュートン

プリンキピアといってもこれですが

App Storeで見かけてピンと来て購入しました
ニュートンが活躍してた時代のヨーロッパを舞台として
たくさんの科学者が競って研究するというシミュレーションゲーム
別に子供向けってわけじゃないんですが
歴史っぽいから娘が興味持つかな―と思いまして

こうやって実験したり推理したりして何か思いついたら
論文書いて提出して、受理されるとちょっと有名になるんだよー
みたいに説明しながらいっしょにやってたらけっこう乗ってきました

そこからこれ
図書館で見つけました もう普通には売ってないみたいですね

よし読み始めた

通常表紙が女の子の絵じゃないと手を付けませんが
なにかのきっかけで読み始めればたいてい読み続けます
今回はいけるかな?

薄い本ですが【宇宙】シリーズで6冊あるので全部あわせるといい感じの分量
で、【宇宙】シリーズがあるなら【数学】とか【素粒子】とかあるんじゃ?
と思いましたが次が【人体・医学】でおしまいなようです
まあニュートンライプニッツヤコブ・ベルヌーイが登場してるから
数学につなげるルートも見つけられるでしょう
コミック伝記系を探そう

ゲームの方はと言うと、レビューであの伝説のゲーム!?みたいなことが
書かれてたんですごいゲームかと思いましたがそこまででもない印象
やりこみ不足もあると思いますが、行動の目的がよくわからなかったり

たとえば、援助の申し出があったときには断ることもできるんですが、
断ると当然援助はもらえませんししかも友好度が下がります
じゃあなんで断る選択肢があるの?みたいな
他にも都市間を移動できるんですけどそれが何?とか
アカデミーに入会するときや大学の講義を受けるときは
そこにいなければならないようですが
ロンドンやパリ以外の年の存在価値がよくわからない、とか

そんな感じでわからなくても進めてしまうことができて
最後にはニュートンがアレやソレを発見しないうちに
アレしてしまうとか

などと文句ばっかり言ってますがなんとなく楽しくプレイしています
全体的なアイデアの力ですかね
お、ヤツがアレ見つけたぞ、とかあーその発見入ってるのか、とか
そういう系に興味がある人は面白くプレイできるかもしれません

ゲーデルの不完全性定理の証明のアレをRacketで書いてみる (11)

「10.8.4 変数・記号・論理式」の続き

時間がかかるのはいつものパターンで書き換え

(define (IsNumberType x)
  (let loop ((k 1))
    (let ((e (elm x k)))
      (cond ((not (= e cf))
             (and (or (= e c0) (IsVarType e 1))
                  (= (elm x (+ k 1)) 0)))
            (else (loop (+ k 1)))))))

瞬時

> (IsNumberType (gnum cf (var 1 1)))
#t

「いつものパターン」というのが本当に見えてれば抽象化できるはずなんだけど・・・
名前付きletをfordoにするくらいしか思いつかないなあ

関数型っぽく書くならどうやって書くんでしょうね?
foldかなんか使うのかな?

今のところWorkflowyな気持ち

 

Dynalist https://dynalist.io/ っていうアウトライナーのサービスがあります 後発だけあってWorkflowyの上位互換的なサービスになってます

Dynalistいいかも - kb84tkhrのブログ

ということでDynalistを試用してますが
今のところの印象は、まだWorkflowyの方がいいかな、って感じです

Dynalistもとてもよいサービスで、機能的にはWorkflowyの上を
行っているところがたくさんあります
それにやっぱり無料で無制限のアイテムは魅力
とりあえずアウトライナー試してみたい、という人向けには
Dynalistを勧めちゃうかなあ
そしてDynalistで始めたらDynalistでいいんじゃない、程度の差でしか
ないような気もします

ではWorkflowyのどこがよいと思ってるのかというと
すごい感覚的なんですが、Workflowyの方が「さらさら」書ける気がするんですよね
追加機能は魅力的ですが、自分は書き味?で選びたい気がしています

DynalistではMarkdownLatexっぽい書き方ができて、
それでいて入力と表示の切り替えを特に意識せずに行うことができます
これはDynalistの売りでしょうし、かなりよくできてると思います
それでも切り替わりは切り替わり
ふとカーソルを見失ったりすることがあります
表示中は1行なのに入力するときは2行になるとか

操作感もどちらかというとWorkflowy持ち
たとえばWorkflowyではStarをつけたアイテムをCtrl+;で呼び出すことができます
DynalistではBookmarkの機能がそれに相当すると思うんですが
ショートカット一発、というわけにはいかず(何か見落としてるかも)
マウスでどっこいしょ、という感じになります
キーのカスタマイズがついてるのはいいんですが

あとWorkflowy単体の機能ではないんですけど
スマホでさっと入力したいときにMemoflowyがあるのが大きい
Dynalistも純正のアプリが提供されているんですが
起動→どこに入力するか考える→そこをうまくタップする→入力、という
ステップは意外と面倒なものです
今やMemoflowyのないWorkflowyは考えられません
Memoflowy以前はWorkflowyに直接入力するのがおっくうで
Twitterで入力して自動でEvernoteに取り込んだものをあとでコピペする、とか
してたほどです

MemoFlowy以外にもHandyFlowyや各種スクリプトなど
有志の方が提供してくださっているツールも含めての評価ってことですね
個人的には正規表現の置換スクリプトを大変重宝してます
Workflowy単体だとまたさらに微妙
Dynalistでそのへんがどうなってるかはまだちょっとわかりません
もしかするともうコミュニティでなにかできてたりするかも

これは完全に自分の印象だけの話なんですが、
Workflowyのほうが「わかってる」ような気がしてます
明確に何がいいのかうまく説明はできないのですが
「アウトラインひとつ」の哲学を筆頭として
アウトライナーについて考え抜いてきた結果なんだろうな、という印象
これは一日の長でDynalistもいずれ「わかってる」感じになるのか、
それともそもそも「哲学」が肌に合う/合わないみたいな話なのか

とにかくProの試用期間が終わるくらいまでDynalist使ってみて決めようかと
やっぱりWorkflowyに戻ったとしてもDynalistもウォッチしていきたいと思います
新しいサービスだしこれからよくなっていくでしょうから

多少のことに目をつぶれば移行に特に苦労するということはなさそうですし
そうそう、Workflowy→Dynalistのデータ移行はメニュー選んでWorkflowyの
アカウントを入力するだけでとても簡単でした
後発のサービスとしては当然の機能ですけどね

ゲーデルの不完全性定理の証明のアレをRacketで書いてみる (10)

「10.8.4 変数・記号・論理式」の続き

定義16 xの、n番目の後続数
定義17 nに対する"数項"

(define (succ n x)
  (cond ((= n 0) x)
        (else (** (<> cf) (succ (- n 1) x)))))

(define ( ̄ n)
  (succ n (<> c0)))

数項の" ̄"はちょっと無理がある気もしますが気持ちはわかってください

単なるゲーデル数でも巨大なのに、それを数項にしちゃうとそれはそれは

定義18 "第1型の記号である"

(define (IsNumberType x)
  (∃ m n ≦ x 
     (and (or (= m c0) (IsVarType m 1))
          (= x (succ n (<> m))))))

と書きたいところですがしまった
変数がふたつあります
∃のマクロは変数ひとつしか対応してませんでした

変数がふたつある場合はえーとこんな風に展開してほしいんだな

(define (IsNumberType x)
  (∃≦ x (λ (m)
          (∃≦ x (λ (n)
                  (and (or (= m c0) (IsVarType m 1))
                       (= x (succ n (<> m)))))))))

ということはマクロ定義は

(define-syntax (define-equipment stx)
  (syntax-parse stx
    ((_ name term notfound found)
     #:with fname (format-id stx "~a≦" #'name)
     #'(begin
         (define (fname max f)
           (let loop ((x 1))
             (cond ((> x max) (notfound x))
                   ((term (f x)) (found x))
                   (else (loop (+ x 1))))))
         (define-syntax (name stx)
           (syntax-parse stx
             #:literals (≦)
             [(_ v:id ≦ max:expr body:expr)
              #'(fname max (λ (v) body))]
             [(_ v1:id v2:id ≦ max:expr body:expr) ; ここから追加
              #'(fname max (λ (v1) (fname max (λ (v2) body))))]))))))

こうかな?
どれ

> (IsNumberType (gnum c0))
#f
> (IsNumberType (gnum cf c0))
#t

あれー0が数字じゃないって言われる
f0は大丈夫なのに
なんでなんで
マクロ変かなあ?
単純に置き換えるだけなのに
えーとえーと

えー何がおかしいのー
Macro stepperさん登場(インデントは手動で追加)

(define (IsNumberType x) 
  (∃≦ x (λ (m) 
          (∃≦ x (λ (n) 
               (and (or (= m c0) (IsVarType m 1)) 
                    (= x (succ n (<> m)))))))))

完全に一致

(IsNumberType (gnum c0))
(IsNumberType 2)
(∃≦ 2 (λ (m) (∃≦ 2 (λ (n) (and (or (= m c0) (IsVarType m 1)) 
                               (= 2 (succ n (<> m)))))))))

えーと∃≦はこうだから

(let loop ((x 1)) 
  (cond ((> x max) ((const #f) x))
        ((identity (f x)) ((const #t) x))
        (else (loop (+ x 1))))))

あっ
1から始まってる!
n=0でないといけないのに!

でもさーそれってさー

Min≦Min(f x)を満たすxが見つからなかった場合は0を返します
x=0から開始すると見つからなかったのかx=0で見つかったのかわからないので
x=1から開始することにしました
も同様に修正
カンが悪かった

で直したとこなのに・・・0から始めちゃって大丈夫かな?
それともMinだけ0からとか?
いやそれはないよな

のところは問題ないとして、Minを使ってるところは見直してみよう
(今や使ってるところないけど元のコードで)

(define (CanDivideByPower x n k)
  (CanDivide x (expt (prime n x) k)))

(define (elm x n)
  (Min k ≦ x (and (CanDivideByPower x n k)
                  (not (CanDivideByPower x n (+ k 1))))))

こことかちょっとマズくない?
0乗すると何でも1になって割れちゃうし
・・・いや、素因数があれば少なくとも1乗はしてるから大丈夫か
ギリギリだなあ
ほかも大丈夫そうだ
ゲーデルさんコンピュータもなしでそこまで考えてたのかね
すごいね

というわけで0から開始するようにして解決

           (let loop ((x 0))

ではあらためて

> (IsNumberType (gnum c0))
#t
> (IsNumberType (gnum cf c0))
#t
> (IsNumberType (gnum c0 c0))
#f

よしよし
次はfx1のパターン

> (IsNumberType (gnum (var 1 1)))

はい予想通り返ってきませんよ
でも今日はここまで