関数の自己適用

Y - コンビネータのλ式は次のようになる。

Y = (λf . (λx . f (x x)) (λx . f (x x)))

このコードには不可解な点が多いが、先ず目につくのは (x x) という関数の自己適用だ。関数 x をそれ自身の x に適用させている。Y-コンビネータはさらにこの関数の自己適用でできた関数を利用して、(f (x x)) (f (x x)) とさらに2重の関数の自己適用を行っている。おそらく、これが、Y-コンビネータの無名関数で再帰的定義の関数をつくるという離れ業の原因だろう。

そこで、まず、最も単純な (x x) という形の関数の自己適用について考えてみた。この形の関数の自己適用が行われたときに x について必要な条件はなんだろうか。まず、x は関数 x を引数として取るので高階関数でなくてはならない。x に 2 を代入して (2 2) としてもこれは動作しない。

それでは x = λy.(y*2) の場合はどうだろうか。この場合 (x x) = ((λy.(y*2)) (λy.(y*2))) となるが、これも動作しない。λy.(y*2) は数値の引数をとり、数値を戻り値として返す関数だ。別の言い方をすると、この関数の domain は数値の集合で、codomain も数値の集合である。従って λy.(y*2) は関数である λy.(y*2) を引数にとることはできない。

こんどは x = id の場合を考えてみる。id x 関数は次のように定義され、引数 y をそのまま返す関数だ。

id y = y

この関数 id は (id id) のように関数の自己適用ができるだろうか。これは可能だ。id は引数 id をそのまま帰すので (id id) = id となる。これは次のように Haskell でも試してみることができる。

Prelude> let id x = x
Prelude> id 2
2
Prelude> ((id id) 2)
2
Prelude> ((id (id id)) 2)
2
Prelude> ((id (id (id id))) 2)
2

(id id) = id なので (id (id id)) や (id (id (id id))) のようなものも全て id と等しくなる。つまり、(x x) という関数の自己適用は、

(x x) = (x (x x)) = (x (x (x x)) = (x(x(x(.... (x x)....))))

と無限に展開するラムダ式を発生させることができる。まるで合わせ鏡のように、(x x) という簡潔な表現の中に無限を閉じ込めることができるのだ。x が関数の場合、x のdomain は関数の集合で、x の codomain も関数の集合なので、この展開は無現に続けることができる。

そこで改めて Y-コンビネータ (f (x x)) (f (x x)) を展開してみよう。

(f (x x)) (f (x x))
= (f ((f (x x)) (f (x x)))
= (f (f ((f (x x)) (f (x x))))
= (f (f (f (f .... ((f (x x)) (f (x x))) .... ))))

やはり、この式が無限に展開できることが分かる。これは f (x x) のように f が合わせ鏡の関数を引数に取るために、それを展開すると f ((f (x x)) (f (x x))) となり、展開された f の引数が ((f (x x)) (f (x x)) のように元のλ式になってしまうからだ。

Y-コンビネータの場合、任意の関数 g を上の f にあてはめることができるので、つぎの等式が成立する

Y g = g (Yg)

したがって g に階乗を求める関数をとると、

(Y g) 5 = 5 * (g (Y g) 4)) = 5 * 4 * (g (Y g) 3) = ...

となって遅延評価の関数言語であれば、階乗の計算ができることになる。それだけではなく、g に任意の再帰関数をとれば、任意の再帰関数の定義が Y g でできることが分かる。

Haskell では遅延評価なのでつぎのように簡単に階乗を計算する無名関数を記述することができる。

Prelude> let y x = x (y x)
Prelude> (y (\f n -> if (n == 1) then 1 else n*(f (n-1)))) 5
120

このように関数が first-order のデータであるような言語では、高階関数の自己適用により合わせ鏡のような関数を記述でき、そのなかに無限の操作を導入することができる。ただし、その場合無限の展開が終わらない場合も出てくるので、絶対に停止するプログラムだけを作ることはできなくなる。

ラッセルのパラドックスのメカニズムも自己言及が原因なので、このような合わせ鏡のメカニズムが関係している可能性がある。素朴集合論の世界は、プログラム記述可能な世界と同じものなのだろう。素朴集合論の世界でも無限を全て捉えたと考えてくると矛盾がでてくるが、プログラムの世界も無限の全体を捉えることはできない。しかし、どちらも無限にそれを展開していくことができるという可能無限な世界なのだ。

[PR]
# by tnomura9 | 2017-11-19 07:05 | ラッセルのパラドックス | Comments(0)

Z - コンビネータ

Y - コンビネータのλ式は次のようになる。

Y = (λf . (λx . f (x x)) (λx . f (x x)))

これを任意の関数 g に関数適用するとつぎのように Y g が g についての不動点になる。

Y g
= (λf . (λx . f (x x)) (λx . f (x x))) g
= (λx . g (x x)) (λx . g (x x))
= (λy . g (y y)) (λx . g (x x))
= g ((λx . g (x x)) (λx . g (x x)))
= g (Y g)

このとき、g が第1引数に関数、第2引数に整数を取るような場合、たとえば g f n = n * f(n - 1) のような場合、

(Y g) 5 = (g (Y g)) 5 = g (Y g) 5 = 5 * ((Y g) 4) = 5 * (4 * ((Y g) 3)) ....

のように再帰的な計算ができることになる。ところが、Y - コンビネータの定義をそのまま Scheme のλ式にコーディングしても動作しない。それは、プログラムのパースのときに、

Y g = g (Y g) = g (g (Y g)) = g (g (g (Y g))) = ....

と無限の展開が行われるからだ。これを解決するためにはつぎのような Z - コンビネータを利用する。

Z = λf. (λx. f (λy. x x y)) (λx. f (λy. x x y))

これは Y - コンビネータの定義に変数 y を付け加え Y - コンビネータの (x x) を λy. x x y に置き換えただけだ。この置き換えは η 変換と言うらしい。変数を1つ付け加えることで Z g の展開は次のように整数 n を巻き込む形になるので、Y g 部分の無限の展開が起きず再帰は base case で停止することができる。

(Z g) n
= (λf. (λx. f (λy. x x y)) (λx. f (λy. x x y)) g) n
= ((λx. g (λy. x x y)) (λx. g (λy. x x y))) n
= g (λy. (λx. g (λy. x x y)) (λx. g (λy. x x y)) y) n
= g (λy. (λf. (λx. f (λy. x x y)) (λx. f (λy. x x y))) g) y) n
= g (λy. (Z g) y) n)
= g (Z g) n

Scheme で実行すると次のようになる。

1 ]=> (define z (lambda(f)((lambda(x)(f(lambda(y)((x x)y)))) (lambda(x)(f(lambda(y)((x x)y)))))))

;Value: z

1 ]=> ((z (lambda(f)(lambda(n) (if (zero? n) 1 (* n (f (- n 1))))))) 5)

;Value: 120

λ計算の面白いところは任意の関数 g についての不動点を作り出す Y - コンビネータの動作が、記号列の等価変換だけで証明できるということだ。不動点による無限の再帰もλ式の記号列の変換だけで定義できる。

しかし、その中には無限の再帰が存在するために、プログラムを解釈して実行するプログラム言語による意味論的な解釈によっては無限の再帰に陥ってプログラムが動作しなくなる場合がある。

プログラムの動作をプログラムの記号列だけが決定しているのであれば、プログラムの記号列を検査するだけでそのプログラムがきちんと動くかどうかを決定できる。しかし、残念ながら任意のプログラムが動作するかどうかを決定するプログラムをλ式で作ることはできないことが証明されているらしい。

ヒルベルトの夢は数学をこのような記号列の変換に閉じ込めようとしたことだ。しかしそれは、

「対角式は証明できない」の対角式は証明できない

という不動点を作り出すことができることをゲーデルが証明し、証明もその否定も証明できない命題が存在することが分かってしまった。(上の命題が証明可能であるとすると「対角式が証明できない」という語の対角式はその命題自身になってしまうのでその命題は証明不可能ということになる。「対角式は証明できない」の対角式が証明不可能であるとすると、その対角式である上の命題が証明可能であるということになるので、いずれもパラドックスになってしまうのだ。

どうやら、プログラム言語を含め、言語には不動点がつきもので、そのことが、絶対に動くプログラムや、全ての真理を網羅した言語を作らせないようになっているらしい。

[PR]
# by tnomura9 | 2017-11-15 23:25 | ラッセルのパラドックス | Comments(0)

λ記法とは何か

プログラマの視点からはλ記法は無名関数を記述できる一種の魔法だ。さらに、無名関数で再帰的定義を可能にする Y コンビネーターのようなものが出てくると、ますます魔法の呪文感が強くなってくる。

しかし、λ計算の本質を考えると、それは、等価な記号列を作るための簡潔な規則でしかない。つまり、λ計算の本質とは、ある文字列からそれと等価な文字列を作るための記号の置き換えの規則に過ぎないのだ。おまけにその規則は3つしかない。つまりα-変換、β-簡約、η-変換の3つだ。λ計算はこれらの規則を使って、等価な文字列を次々に作って行くという意味しかない。

α-変換と言っても単なる変数名の付け替えだし、β-簡約は変数を値で置き換えることで、η-変換は関数 X の変数を表に出すか出さないか、つまり λx.X x = X という置き換え規則でしかない。

λ記法でプログラムが書けるように思えるのは、コンパイラやインタープリターが勝手に文字列を解釈して実行するからだ。λ計算自体は単なる記号の置き換えでしかない。Haskell や Scheme でラムダ記法で書いたプログラムが動いたり動かなかったりするのは、その記号列をそれらの処理系が意味論的に翻訳する時の問題で、ラムダ記法は本来は意味論とは無関係な統語論的な規則なのだ。

統語論的という意味は、その記号列にプログラムとしての意味があるかどうかは無関係に、記号の置き換えのルールに従って記号を置き換えて等価な記号列に変形していくということだ。

たとえば、つぎのような Y コンビネータには (x x) のような関数の自己適用があったりして呪文感が半端ないが、

Y = (λf . (λx . f (x x)) (λx . f (x x)))

Y を任意の関数 g に関数適用して不動点 Yg を作り出すことの証明は、単に変数を引数で置き換えたり、その逆をやったり、変数の名前を付け替えたりしているに過ぎない。

Y g
= (λf . (λx . f (x x)) (λx . f (x x))) g(Yの定義より)
= (λx . g (x x)) (λx . g (x x))(λfのβ簡約、主関数をgに適用)
= (λy . g (y y)) (λx . g (x x))(α変換、束縛変数の名前を変える)
= g ((λx . g (x x)) (λx . g (x x)))(λyのβ簡約、左の関数を右の関数に適用)
= g (Y g)(第2式より)

これは中学校のときに習った2次方程式 ax^2 + bx + c = 0 の一般解を求める時の操作と同じことをしているだけだ。

したがって、関数の自己適用 (x x) のようなものもその意味を考える必要はないのだ。自己適用のある関数 (x x) を更に自己適用する ((f (x x)) (f (x x))) という不可思議な呪文も、単に文字列として捉えれば、それを等価変換していくと Y g = g (Y g) という不動点にたどり着くだけのことだ。

このようにλ計算そのものは単に記号の置き換えだと考えると、そこにはなんの不思議な事もない。しかし、関数の自己適用とは何かなどと、(x x) の意味論まで考えてしまうと、迷宮に迷い込んでしまう。

このように、λ計算は記号列の統語論的な変換規則なのだと割り切ってしまうと、その意味が理解しやすくなる。

[PR]
# by tnomura9 | 2017-11-13 06:36 | ラッセルのパラドックス | Comments(0)

万物は数である

全く直感的な話で根拠はないが、チューリング機械、ラムダ計算、素朴集合論、可算集合はみな同じものを表しているような気がする。そうしてこれらには不可避的にラッセルのパラドックスが存在する。

小さなプログラムでも作成していると、無限ループや無限の再帰によるスタックオーバーフローなどよく経験するが、これらはラッセルのパラドックスによって起きている。実際にはこれらのバグを避けながらプログラムを作っていく。

集合論を基礎に数学の理論を組み立てていくときも同様なことが起きる。端的なのがゲーデルの不完全性定理だ。これは一階述語論理におきたラッセルのパラドックスだ。

全能者は非全能者となり得るかという哲学の議論もラッセルのパラドックスだ。

これらのラッセルのパラドックスは、その体系が本質的に不動点を抱え込んでいるためにおきる。不動点とは f(x) = x となる x のことだ。不動点をもつシステムではラッセルのパラドックスを回避することはできない。

自然現象の全てはコンピュータでシミュレーションできるので、「万物は数である」というピタゴラスの主張は正しかった。しかし、その数はラッセルのパラドックスを抱えていたために無理数が発見されてしまった。

これからも人間はラッセルのパラドックスを抱えたシステムで、バグをうまく避けながら世界を探求していくのだろう。

[PR]
# by tnomura9 | 2017-11-08 07:33 | 考えるということ | Comments(0)

チア☆ダンを見た

福井商業高校チアリーダー部の情報を集めているうちに、映画『チア☆ダン』を見たくなって、ケーブルテレビでビデオをダウンロードして観た。

高校生を演じた女優たちが可愛くて、ダンスにも本気で挑戦していたのがわかって、これはこれで面白かったが何か物足りなかった。わかりやすくて楽しめたが、もう少し掘り下げたら感動的な映画になったかもしれない。

調べたチアリーダー部の創立の経緯は、明るく楽しい高校生生活とはかけ離れたものだったような気がする。作家がきちんと取材していればはっきりとこの物語の魅力に気が付いたはずだ。

ひとりの体育教師が部活の指導に苦労し、自信を失いつつある中でふと見かけた、朝のニュース番組。そこで紹介された全米大会で優勝した日本のチアリーダー部の演技。何かが教師の中で生まれた。

新しい赴任地で、教師は伝統あるバトン部をチアリーダー部へ変更することを提案する。晴天の霹靂のようなバトン部をチアリーダー部に変更したいとの顧問の要求に振り回されていく周囲の先生や生徒や父兄の戸惑いと反発。地獄先生と陰で言われるほどの顧問の強烈なパーソナリティと情熱はしかしその圧力にめげなかった。

全米大会での優勝というありえない目標を突きつけられたうえ、その指導の厳しさに反発して50名いたバトン部員が1年生の9名しか残らなかった。なんと、チアリーダー部創設を主張した顧問自体が、実は少林寺拳法の有段者でダンスとは無縁だったのだ。厳しい指導に反発した学年の部員が全員退部し、職員室の顧問の目の前で机の上に次々にユニホームを置いて帰ったときの顧問の孤独。

この9名の1年生がなぜ周囲からの批判に耐え顧問の指導についていったのかも取材すると面白そうだ。

初心者ばかりの部員には最高の専門的な指導の必要性を感じた顧問の努力で、東京から専門のインストラクターを月に1回招いて指導を受けることができるようになった。顧問の厳しい指導の下、その月1回の講師の指導をビデオに録り何回も再生して自分たちで練習し、与えられた課題を消化していった部員たち。また、真剣に努力するが故の部員たちの相互の反発。

徐々に力をつけながらも大会で実績を上げられない部員たち。揺れる部員たちの心とそれを支え続ける顧問。それは「人は変われる」をモットーに生徒たちの脳を騙して「私はできない」から「私はできる」に変化させるものだった。

その部員たちの苦闘を見ながらも、入部してきた新入生。生徒たちの意識の変革が始まった。「できない」は「きっとできる」に変わり、全員の心が一つになって成長のスパイラルが動き始める。補欠は1人も作らないとの顧問の熱意が達成した全員がセンターの技量。本大会前のセンター2人の故障のピンチと、急遽編成替えをしたメンバーでの逆転勝利。ありえないと思っていたことが実現していく。ついに達成した全国大会の優勝と全米選手権への参加資格。そうして、初出場にしてまさかの優勝。

ドラマのラストは優勝の演技を邪魔を入れずそのまま再現したらどうだろうか。たった2分半だ。しかし、それはダンスを知らない教師のあり得ない夢から始まった3年間の皆の苦悩と苦闘とから生まれたメタモルフォーゼなのだ。

これだけの素材が揃っているのだ。TVシリーズになるそうだが、仲良し学園ドラマとはまったく違う骨太の『チア☆ダン』を作ってみたらどうだろう。

強烈な個性の賢者の石に触れて、想像すらできなかった変貌を遂げる子どもたちの、類まれな物語を堪能したいものだ。

[PR]
# by tnomura9 | 2017-11-01 20:34 | 話のネタ | Comments(0)

福井商業高校チアリーダー部

福井の高校のチアリーダー部が全米チアダンス選手権5連覇


入部してきた頃はほとんどが初心者。2年間で変貌する。本当に。

福井商業高校チアリーダー部 ありのままのJETS

顧問はダンスの経験がなく、プロのダンサー・振付師に月に1回生徒の指導を仰いだたとのこと。登美丘高校ダンス部といい、高校生の潜在能力の高さに驚かされる。しかし、指導のあり方についても考えさせられる事例だ。

エピローグ


追記

見落としていた動画の追加



[PR]
# by tnomura9 | 2017-10-31 07:55 | ボーカロイド | Comments(0)

Haskell の Y コンビネータ

Yコンビネータの情報を探していたら Haskell でもできるという記事を見つけた。Haskell は型つきラムダ記法なので再帰関数はラムダ記法では定義できないはずだと不審に思ったが、次のように試してみた。

Prelude> let y x = x (y x)
Prelude> y (\f n -> if (n == 1) then 1 else (n * (f (n - 1)))) 5
120

...... 動いてしまった。

厳密には Y コンビネータ y の定義はラムダ記法ではないが、y x = x (y x) という動作をする高階関数の引数にラムダ記法の関数を与えると、第1引数にその関数自身がバインドされて再帰関数が定義できることが分かった。

Y コンビネータの威力が y x = x (y x) という不動点 (y x) で発揮されることが分かる。なぜそういうことが起きるのか考えてみた。

y x = x (y x)

なのでコンビネータ y は関数をひとつ引数に取る1変数関数だ。また、再帰関数を定義するときは x に上の階乗の例から分かるように関数と数値を引数に取る2変数関数を与える。そこで階乗を計算するための関数 g を g f x のように関数 f と整数 x を引数に取る2変数関数で表現してみる。すると、

y g = g (y g)

なので、(y g) を整数 3 に関数適用すると次のようになる。

(y g) 3 = (g (y g)) 3 = g (y g) 3

これは関数 g = \f n -> if n == 1 then 1 else n = n * (f (n - 1)) の f に (y g) がバインドされ、n に 3 がバインドされていることを示すので、

(y g) 3 = g (y g) 3 = 3 * ((y g) 2)

である。

同様に、(y g) 2 = 2 * ((y g) 1), (y g) 1 = 1

となるから、結局

(y g) 3 = g (y g) 3 = 3 * ((y g) 2) = 3 * 2 * ((y g) 1) = 3 * 2 * 1 = 6

と不動点 (y g) による再帰的計算が行われ 3 の階乗の 6 が計算される。つまり、高階関数 y が、

y x = x (y x)

のように不動点 (y x) を作り出す関数であれば、これを関数と整数の2つの引数をもつ2変数関数に関数適用すると、どのような再帰関数も作り出すことができることになる。この場合、どのような再帰関数を y コンビネータで定義しても、その(局所)関数名は (y x) という不動点になる。

Scheme で作った複雑な Y コンビネータも結局は y x = x (y x) という不動点を作り出す関数を定義したに過ぎない。Scheme の場合は Y コンビネータの定義もλ記法でできるので、型なしλ計算が再帰関数を記述できる根拠となる。しかし、Haskell でも y x = x (y x) のように y を定義するだけで、簡単に不動点を作り、無名再帰関数を記述できることが分かる。

追記

同じ発想で Scheme でもできないかと思ってやってみたが、スタックオーバーフローになってしまった。

y g = g (y g) = g (g (y g) = g (g (g (y g))) = ...

と永遠に β 変換をやり続けたためらしい。これを防ぐために前回の記事では Z コンビネータが使われていたようだが、これを y x = x (y x) の形にすることができなかった。β 変換の順序次第で無限ループになってしまうところが λ 計算の面白いところだ。真実はひとつではない?

[PR]
# by tnomura9 | 2017-10-25 12:32 | ラッセルのパラドックス | Comments(0)

Y コンビネータの使い方

型なしラムダ計算の勉強のために Scheme をインストールした。

Linux : > sudo apt-get install mit-shceme
Mac : > brew install mit-scheme
Windows : Gaushe のインストーラをダウンロードした。(MIT Scheme が何故か動かなかった。)

型なしラムダ計算を学習しようと思ったのは、関数の自己適用がラッセルのパラドックスと関係があるのではないかと思ったからだ。ラムダ計算で関数の自己適用が現れるのは不動点コンビネータの Y コンビネータだ。ラムダ計算の教科書の説明では1ページくらいで解説してあるが、Scheme で実行しようとして躓いた。

そこでネット検索で、Y コンビネータで再帰的プログラムがかけることがわかった。再帰的プログラムの代表は階乗の計算だ。Scheme では次のように書ける。

1 ]=> (define (factorial n) (if (zero? n) 1 (* n (factorial (- n 1)))))

;Value: factorial

1 ]=> (factorial 5)

;Value: 120

しかしながら、これは自分自身を呼び出すのに関数名を必要としているので、ラムダ計算は使えない。

ところが、Y コンビネータを使うとラムダ計算でも再帰関数を定義できる。ラムダ計算の Y コンビネータは次のようになる。

Y = (λf . (λx . f (x x)) (λx . f (x x)))

何のことか分からないが、Scheme で記述した Y コンビネータは次のようになる。

1 ]=> (define yc (lambda (f) ((lambda (x) (f (lambda (n) ((x x) n)))) (lambda (x) (f (lambda (n) ((x x) n)))))))

;Value: yc

関数 (x x) に値を与えるための変数 n をλ記法で確保した以外はほぼ上のλ計算の Y コンビネータと同じものだ。Y コンビネータの一種で Z コンビネータというらしい。λ計算の Y コンビネータには任意の関数 g に関数適用することによって。

Y g = g (Y g)

となり、Y g が g の不動点になることがわかっている。とは言え、この Y でどうやって再帰関数を記述することができるのだろうか。

いろいろな解説をウェブで見たが、はっきりわからなかったのでこの記事を書いたわけだが、とにかく動くプログラムを作って動作させて見ることにした。Y コンビネータを使った階乗の関数は次のようになるが、実際に動作しているのが分かる。

1 ]=> (define fact (yc (lambda (f) (lambda (n) (if (zero? n) 1 (* n (f (- n 1))))))))

;Value: fact

1 ]=> (fact 5)

;Value: 120

そこで、階乗の計算を定義した部分を g とすると、上の定義は、

fact 5 = (Y g) 5 = g (Y g) 5

となるが、g(f, n) の引数 f に Yg がはいり、g の引数 n に5が入るので、

fact 5
= (g (Y g) 5)
= (if (zero? 5) 1 (* 5 ((Y g) 4)))
= 5 * ((Y g) 4)
= 5 * (g (Y g) 4)
= 5 * (if (zero? 4) 1 (* 4 ((Y g) 3)))
= 5 * 4 * ((Y g) 3)
...
= 5 * 4 * 3 * 2 * 1 * 1 = 120

と毎回関数 (Y g) が g の引数 f に入るので再帰関数の計算ができることになる。

要するに、λ記法で記述された関数に Y を関数適用すると第1引数を使ってその関数自身を利用するという、再帰的定義ができるのだ。無名関数であるλ記法で再帰的定義ができるという不思議な現象が起きてしまうが、このことによってλ記法はループのあるプログラムを作ることができるのが分かる。

Y コンビネータとは何かと考えるのは大変だが、Y コンビネータを使って再帰関数を定義する方法は意外に簡単だった。

[PR]
# by tnomura9 | 2017-10-24 07:21 | ラッセルのパラドックス | Comments(0)

利尿薬でどうして血圧が下がらないのか

ある人に、心不全の患者さんに利尿薬が3種類も処方されているのに血圧は下がらないのかと尋ねられた。確かに利尿薬で体液は減るわけだから、血圧は下がってもいい。しかし、ひどく下がるときもあるが大抵はあまり血圧が下がるということはない。なぜなんだろう。

一般に血圧というのは動脈圧を指している。しかし、動脈が分岐して毛細血管になる頃には動脈圧はほとんど0になってしまう。つまり、血圧の影響は毛細血管までしか届かない。血液が毛細血管を抜けて静脈へ行く頃には、心臓の拍出による血圧の影響はなくなり、静脈の還流には心臓の影響はないに等しい。

すなわち、血液循環のシステムは動脈系のコンパートメントと静脈系のコンパートメントにはっきりわけられていると考えることができる。

したがって、利尿薬によって腎臓から失われた体液は動脈系のコンパートメントから失われるのか、静脈系のコンパートメントから失われるのかをはっきりしておく必要がある。

動脈血は腎臓の糸球体で濾過され、尿細管やヘンレのループで再吸収される。この際、再吸収された血液は腎静脈に戻っていき、動脈に戻ることはない。利尿薬によって腎臓から尿として体液が排出されたとしても、体液量が減るのは静脈系の循環血液量が減るのであって、動脈系の血液容量には変化がない。

血圧は動脈系の血液容量と動脈のコンプライアンスで決まるので、動脈系の血液容量の変化がなければ血圧は下がらないのだ。利尿薬を使っても血圧があまり下がらないのはそういう理由からだ。

それでは、どのようなときに血圧は下がるのだろうか。動脈の末梢血管が拡張して末梢血管抵抗が下がると、動脈全体の血液量が減少する。動脈のコンプライアンスが変化しなければ動脈の血液容量が減少するため血圧は下がってしまう。したがって、血圧を下降させるためには利尿剤で体液量を減少させることよりも末梢血管の抵抗を減らしたほうが効果的だ。

また、心拍出量が減少すれば動脈系のインとアウトのバランスから動脈の血液容量が減少し、これも降圧の要因となる。それでは、心拍出量が減少するのはどのようなときだろうか。それは、左房への肺からの血液の還流が減少する場合だ。肺への血液の供給は右室が行うので、右室の拍出量が、左室の心拍出量の鍵を握っていることになる。右室梗塞の時の治療抵抗性の低血圧はこの機序によっている。

右室の収縮力が機能している場合、右室からの拍出量は、右房への静脈還流量に依存している。そうして、右房への静脈還流量は大静脈と右房の圧較差、すなわち大静脈の静脈圧に依存する。さらに、大静脈の静脈圧は静脈系の血液容量と静脈系のコンプライアンスに依存することになる。

静脈のコンプライアンスは、動脈のコンプライアンスより遥かに大きいので、静脈系の血液容量の変化は、動脈に比べ静脈圧にあまり影響しない。すなわち、利尿薬で利尿を行っても、静脈圧の変化は動脈に比べ僅かなものになる。このため利尿薬による体液の減少は静脈圧の現象にあまり寄与せず、そのため右室の拍出量は減少せず、ひいては左室の心拍出量の減少にも繋がらず、血圧低下がみられない。

血圧は心拍出量と末梢血管抵抗と循環血液量に影響をうけるとしても、動脈系と静脈系に分けて考えなければ利尿剤の影響を予測できないことが分かる。

[PR]
# by tnomura9 | 2017-10-23 22:10 | 考えるということ | Comments(0)

Darci Linne

2017年の America's Got Talent の優勝者

Darci Linne


すごい!!

ちなみに、準優勝は

Angelica Hale


天使!!


追記

準決勝で敗退したけれどこの子も素晴らしい。

Celine Tam


将来、美人になりそうだし、これからが楽しみだ。



3人の Golden Buzzers の動画もある。


[PR]
# by tnomura9 | 2017-10-16 23:04 | ボーカロイド | Comments(0)