scala 関数

scalaは関数がfirst classオブジェクトなので関数を引数に渡したり出来る。

今まで触ってきた言語(coq除く)は型なしの言語ばかりだったので、戸惑うこと多し。

def test(f:(Int => Int) { f(100) }

test(x=>x+100)
// Int = 200

test{x=>x+200}
// Int 300
// 関数リテラルを引数で渡すときは、小括弧でも中括弧でもよいようだ。


//引数なしの関数リテラルを引数に渡したい場合。
def test2(g:(() => Int) { f() }

// NG def test2(g: => Int) { f() }
// NG def test2(g:(=>Int)) { f() }

Play2の trait Action は、

  • Request型変数引数に取ってStatus型変数を返却する関数か、
  • 引数を取らずに、Status型変数を返却する関数

を引数に取るようだけども、
宣言の読み方がまだちっとも分かってない。

https://github.com/playframework/playframework/blob/2.4.4/framework/src/play/src/main/scala/play/api/mvc/Action.scala

trait Action[A] extends EssentialAction {
...

の[A]ってなんや。

javaの関数の引数違いのOverrideは
applyメソッドを引数や戻り値を違ったふうに何回も宣言するのか。
applyを特別扱いしてるので
Action.apply(パターン1)は Action(パターン1)と書けるらしいな。

scala

仕事でplay2を触るらしい。多分scalaではないと思うが。

いい機会だからscalaも触ってみようかと。

とりあえず、

class と object
var と valを 覚えた。

classとobjectの関係は、jsのobjectとプロトタイプみたいなもんらしい。
jsのプロトタイプって自分から使ったことねーけど。
勿論jsのプロトタイプメソッドは、thisを使えるから同じではない。

var は変更出来る変数。
val は変更出来ない変数。

根っこがjavaだから中途半端に見えるね。
制御構造が少ないとかなんとか書いてあるけど、わけわからんキーワードは大量にあるし、ごちゃごちゃしてて見通しは悪そう。

述語論理のタブロー法

先日のやつより、以下の量化子に対するタブロー規則が得られる。

  • からが得られる。aは任意のパラメータでよい
  • からTφ(a)が得られる。aはまだ使われてないパラメータでなければならない。
  • F∀xφ(x)からTφ(a)が得られる。aはまだ使われてないパラメータでなければならない。
  • F∃xφ(x)からTφ(a)が得られる。aは任意のパラメータでよい

  • 「全てのxについてPである。」の反証は、Pでないxを一つ例示すればよい。
  • 「あるxについてPである。(Pであるxが存在する)」の証明は、Pであるxを持って来ればよい。
  • 「全てのxについてPである。」を証明するためには、xが属する集合すべてについて、Pであることが言えればよい。(数学的帰納法とかで)
  • 「あるxについてPである。」を反証するためには、xが属する集合すべてについて、Pでないことが言えればよい。

空ゆえに真

一般に、Aが一つもなければ、命題「全てのAはBである」は必ず真になる。(専門用語では、「空ゆえに真(vacuously true)」という。)驚くかもしれないが、次の命題は真である。

この文に反証する唯一の方法は、少なくとも一頭の五本足ではないユニコーンを提示することであるが、ユニコーンは一頭もいないので、そのようなユニコーンを提示することは出来ない。だから次の命題も真。

すべてユニコーンについてのどんなことも、それは空ゆえに真になる。一方、命題「全ての馬は六本足である。」という命題は偽だということが簡単に示せる。単に四本足の馬を連れてくればいい。

スマリヤン記号論理学 一般化と記号の12章より。

私の赤ちゃん

  1. 全ての人は私の赤ちゃんを愛する。
  2. 私の赤ちゃんは私だけを愛する。

ゆえに私は私の赤ちゃんである。

はあ?

1より、
「全ての人」の中に「私の赤ちゃん」は当然含まれるため、
「私の赤ちゃん」は「私の赤ちゃん」を愛する。

そして、
2より、「私の赤ちゃん」は「私」だけを愛しているため、

私 = 私の赤ちゃんが成立する。


スマリヤン記号論理学 一般化と記号の12章より。