初めてのソフトウェア特許出願　その1 出願前に検討すべきこと

 (0)はじめに
===

ソフトウェアについて日本で特許出願を考えているプログラマに情報提供をすることを目的として、ソフトウェア特許出願についてのあれこれを説明する。
本記事では、以前の「サポートベクターマシン（のライブラリLIVSVM）を使ってpythonでFizzBuzzを書いてみた。」のプログラム（以下、「本件プログラム」という。）について特許出願をする場合を念頭に置いて説明する。

ソフトウェア特許出願についてのあれこれは、(1)出願前に考慮すべきこと、(2)出願書類とはなにか、(3)出願中にしなければならないこと、(4)特許後にできることに分けられると思う。
　本記事では、(1)出願前に考慮すべきこと、さらに細かくは、(1)出願前に考慮すべきことのうち、プログラムが特許になるかどうかを具体的に説明する。

なお、記事で紹介している情報で損害を被ったとしても、当該損害について筆者は一切の責任を負わない。また、この記事は、2015年9月19日時点の日本の特許法及びその解釈を前提として記載している。国外については、ややこしくなるのでここでは触れない。

(1)参考文献
===

サポートベクターマシン（のライブラリLIVSVM）を使ってpythonでFizzBuzzを書いてみた。
http://qiita.com/cof/items/e02ada0adb1106635ac9

特許法
http://law.e-gov.go.jp/htmldata/S34/S34HO121.html
特許・実用新案審査基準
https://www.jpo.go.jp/shiryou/kijun/kijun2/tukujitu_kijun.htm#mokuji

(2)出願前に考慮すべきこと
===

出願前に考慮すべきことは、すくなくとも、(2-1)特許が取れるか、(2-2)特許をどう活用できるのか（特許を取っていくら儲かるのか、特許で何がしたいのか）、(2-3)特許取得にいくら金がかかるのか、がある。
本説明では、(2-1)特許が取れるかを主に検討する。

複数人で出願する場合は、どう出願するかとか、だれが書類を作成するかとか、どのように費用負担をするかとか、どのように権利の持ち分を持つかなども検討すべきであろう。

(3)特許が取れるか
===

まず、そもそもソフトウェアは特許になるのか、どんなものが特許になるのか。

（読み飛ばし可　ここから）
特許法第29条第1項は、「産業上利用することができる発明をした者は、次に掲げる発明を除き、その発明について特許を受けることができる。（以下省略）」と規定している。
また、さらに、特許法第29項第2項は、「特許出願前にその発明の属する技術の分野における通常の知識を有する者が前項各号に掲げる発明に基いて容易に発明をすることができたときは、その発明については、同項の規定にかかわらず、特許を受けることができない。」と規定している。
（読み飛ばし可　ここまで）

これらのうち、実際上問題になりやすいのは、以下の4点であると思う。

(3-0)特許出願対象は何か。
(3-1)特許出願対象が「発明」であるか否か（発明該当性）
(3-2)その発明が「産業上利用することができる」発明であるか否か（産業上利用可能性）
(3-3)その発明が「次に掲げる発明」（公知の発明）に該当するか（新規性）
(3-4)その発明が公知の発明に基づいて容易に発明できたかどうか（進歩性）

本件プログラムについて、上記を大雑把に検討する。

(3-0)特許出願対象は何か。
---

特許出願対象は、アイディア（抽象的な概念）でもよく、実際のコードである必要はない。たとえば、上記はpythonで記載されているものの、同じような処理を実行するのであれば、Cで書かれても良い。

本件プログラムは、次のようなプログラムである。各メソッドの動きなどについては、上記記事を参照されたい。

```py
def main():
  START = 1
  FINISH = 101
  TEST_START = 101
  TEST_FINISH = 3001

  #学習用データの作成
  data, label1, label2, label3 = create_trainers(TEST_START,TEST_FINISH)

  #学習
  m1 = study(data,label1)
  m2 = study(data,label2)
  m3 = study(data,label3)

  #未学習データの作成
  params, expected_label1, expected_label2, expected_label3 = create_trainers(START,FINISH)

  #未学習データから出力の取得
  p1_labels, p1_acc, p1_vals = svm_predict(expected_label1, params, m1)
  p2_labels, p2_acc, p2_vals = svm_predict(expected_label2, params, m2)
  p3_labels, p3_acc, p3_vals = svm_predict(expected_label3, params, m3)

  #結果の表示
  for n in range(START,FINISH): print output(n, p1_vals[n-1][0], p2_vals[n-1][0], p3_vals[n-1][0]), 
main()
```

ということで、今回の特許出願対象を、以下のように定義する。(ちなみに、分かりやすくするため、かなり限定している）

整数または文字列を表示するディスプレイを備えるコンピュータに、
教師信号を有する試験データに対し、所定の数で割った時の余りに基づいて、15の倍数、15の倍数でない5の倍数、15の倍数でない3の倍数、3の倍数でも5の倍数でもない数のいずれかに分類するための分類基準の学習を行う学習ステップと、
対象値を、前記学習部により学習された前記分類基準に基づいて、15の倍数、15の倍数でない5の倍数、15の倍数でない3の倍数、3の倍数でも5の倍数でもない数、のうちのいずれか１つに分類する分類ステップと、
前記分類ステップにおいて前記対象値が15の倍数と分類された場合、FizzBuzzと前記ディスプレイに表示し、
前記分類ステップにおいて前記対象値が15の倍数でない5の倍数と分類された場合、Buzzと前記ディスプレイに表示し、
前記分類ステップにおいて前記対象値が15の倍数でない3の倍数と分類された場合、Fizzと前記ディスプレイに表示し、
前記分類ステップにおいて前記対象値が3の倍数でも5の倍数でもない数と分類された場合、入力値を前記ディスプレイに表示させる表示ステップとを実行させるプログラム。

教師信号とは、label1,label2,label3であり、試験データとは、dataである。

学習ステップとは、以下の部分である。

```py
m1 = study(data,label1)
m2 = study(data,label2)
m3 = study(data,label3)
```

対象値とは、paramsである。
分類ステップとは、以下の部分である。

```py
p1_labels, p1_acc, p1_vals = svm_predict(expected_label1, params, m1)
p2_labels, p2_acc, p2_vals = svm_predict(expected_label2, params, m2)
p3_labels, p3_acc, p3_vals = svm_predict(expected_label3, params, m3)
```

表示ステップとは、以下の部分である。

```py
print output(n, p1_vals[n-1][0], p2_vals[n-1][0], p3_vals[n-1][0])
```

(3-1)発明該当性:本件プログラムが「発明」であるか否か
---

この点については、色々難しいこともあるのだけれども、日本においては、「機器等(例：炊飯器、洗濯機、エンジン、ハードディスク装置、化学反応装置、核酸増幅装置)に対する制御又は制御に伴う処理を具体的に行うもの」は発明に該当するとされている(※1)。

※1 特許・実用審査基準　第 1 章 発明該当性及び産業上の利用可能性　p6
https://www.jpo.go.jp/shiryou/kijun/kijun2/pdf/tukujitu_kijun/03_0100.pdf

本件プログラムは、数字やFizzBuzz等の文字列をディスプレイ（表示装置）に表示させるプログラムなので、発明に該当する（はず）。

(3-2)産業上利用可能性:本件プログラムが「産業上利用することができる」発明であるか
---

日本の特許実務では、以下の発明は産業上利用できないとされている（※2）。

(i) 人間を手術、治療又は診断する方法の発明
(ii) 業として利用できない発明
(iii) 実際上、明らかに実施できない発明

※2 特許・実用審査基準　第 1 章 発明該当性及び産業上の利用可能性　p7-p8
https://www.jpo.go.jp/shiryou/kijun/kijun2/pdf/tukujitu_kijun/03_0100.pdf

このうち、「業として利用できない発明」とは、「(i) 個人的にのみ利用される発明(例：喫煙方法)　(ii) 学術的、実験的にのみ利用される発明」を言う。

本件プログラムは、思いっきり「(i) 個人的にのみ利用される発明(例：喫煙方法)」または「(ii) 学術的、実験的にのみ利用される発明」のような気がしないでもないが、ここには目をつぶることとする。

(3-3)新規性:本件プログラムが「次に掲げる発明」（公知の発明）に該当するか
---

（読み飛ばし可　ここから）
次に掲げる発明とは、次の発明を言う。
一 　特許出願前に日本国内又は外国において公然知られた発明
二 　特許出願前に日本国内又は外国において公然実施をされた発明
三 　特許出願前に日本国内又は外国において、頒布された刊行物に記載された発明又は電気通信回線を通じて公衆に利用可能となつた発明
（読み飛ばし可　ここまで）

簡単に言えば、特許出願時点において、公知の発明（秘密保持義務を有さない人（※3）に知られた発明、知られうる可能性のあった発明）は、特許を受けることができない。
※3 社内の人、弁理士とかなら大体OK

ここで注意したいのは、他の人が「実施している」発明ではなく、他の人に「知られた」発明である点である。発明者しか実施していなくても、それが他の人に知られていれば（※4）、特許を受けることはできない。
一方、発明者が実施しているとしても、他の人に知られていなければ特許の可能性はある。しかし、これは後々特許無効にされるなどのリスクがあるのでお勧めしない。

※4 Webサイトに発明の説明を載せたなど、知られる可能性がある場合を含む。

とにかく、新しいアイディアを思いついて、それについて特許を取ろうと考えたのであれば、それを製品に載せたり、どっかで発表したり（Web発表含む。）する前に特許出願を行うべきである。

本件プログラムについて言うと、2015/3/11時点でqiitaにそのソースコードが公開されているので、本件プログラムは、現時点(2015/9/19)において、公知の発明に該当する。

よって、本件プログラムについて特許を受けることはできない。

～～～～完～～～～

などと言ってしまうと元も子もないので、ここでは、本件プログラムは、公知ではないものとして扱う。
なお、自分が公知にしたのであれば、公知から6か月以内であれば例外的に公知にならなかったとして扱うよう申請できる場合もあるが、ここでは説明しない。

(3-4)進歩性:本件プログラムが公知の発明から容易に想到できた発明であるか
---

本件プログラムに新規性があるとしても、本件プログラムが公知の発明から容易に想到できた発明である場合、本件プログラムは特許を受けることができない。
容易に想到できることとは、普通のプログラマが公知の発明によく知られた技術を組み合わせるなど、公知の発明から簡単におもいつけるという論理づけができることをいう。

本件プログラムに進歩性があるか(本件プログラムが公知の発明から容易に想到できた発明であるか）は、以下のステップによって判断される。
(A)特許出願時点で公知の発明のうち、本件プログラムに近い発明（引用発明）を特定する。
(B)本件プログラムと引用発明との一致点、相違点を認定する
　なお、(3-3)では省略したが、本件プログラムと引用発明とに相違点がない場合に、本件プログラムは公知の発明であり、新規性がないということになる。
(C)特許出願時点で公知の技術に基づいて、相違点を埋めることが容易にできたかどうかを検討する。

(A)以下のサイトに記載されたFizzBuzzのCのコードを本件プログラムに近い発明（引用プログラム）とする。
https://ja.wikipedia.org/wiki/Fizz_Buzz

（読み飛ばし可　ここから）

```c
#include <stdio.h>

int main(void)
{
    int i; 
    for (i = 1; i <= 100; i++) { #iが対象値
        if (i % 3 == 0 && i % 5 == 0) { #分類ステップ
            printf("FizzBuzz\n");　#表示ステップ
        } else if (i % 3 == 0) {　#分類ステップ
            printf("Fizz\n");　#表示ステップ
        } else if (i % 5 == 0) {　#分類ステップ
            printf("Buzz\n");　#表示ステップ
        } else {　#分類ステップ
            printf("%d\n", i);　#表示ステップ
        }
    }
    return 0;
}
```

上記引用プログラムは、本件プログラムに対応する、以下の構成を備える。

整数または文字列を表示するディスプレイを備えるコンピュータに、(上記引用プログラムには、printが含まれるからディスプレイを備えるコンピュータに実行させることが前提となっている。）
対象値を、所定の数で割った時の余りに基づいて、15の倍数、15の倍数でない5の倍数、15の倍数でない3の倍数、3の倍数でも5の倍数でもない数、のうちのいずれか1つに分類する分類ステップと、（if文）
前記分類ステップにおいて前記対象値が15の倍数と分類された場合、FizzBuzzと前記ディスプレイに表示し、(print FizzBuzz文)
前記分類ステップにおいて前記対象値が15の倍数でない5の倍数と分類された場合、Buzzと前記ディスプレイに表示し、(print Buzz文)
前記分類ステップにおいて前記対象値が15の倍数でない3の倍数と分類された場合、Fizzと前記ディスプレイに表示し、(print Fizz文)
前記分類ステップにおいて前記対象値が3の倍数でも5の倍数でもない数と分類された場合、入力値を前記ディスプレイに表示させる表示ステップと、(print i文)
を実行させるプログラム。

(B)一致点と相違点の認定
本件プログラムと引用プログラムとは、以下の点で一致する。
整数または文字列を表示するディスプレイを備えるコンピュータに、
対象値を、15の倍数、15の倍数でない5の倍数、15の倍数でない3の倍数、3の倍数でも5の倍数でもない数、のうちのいずれか1つに分類する分類ステップと、
前記分類ステップにおいて前記対象値が15の倍数と分類された場合、FizzBuzzと前記ディスプレイに表示し、
前記分類ステップにおいて前記対象値が15の倍数でない5の倍数と分類された場合、Buzzと前記ディスプレイに表示し、
前記分類ステップにおいて前記対象値が15の倍数でない3の倍数と分類された場合、Fizzと前記ディスプレイに表示し、
前記分類ステップにおいて前記対象値が3の倍数でも5の倍数でもない数と分類された場合、入力値を前記ディスプレイに表示させる表示ステップと、
を実行させるプログラムである点。
（読み飛ばし可　ここまで）

本件プログラムと引用プログラムとは、以下の点で相違する。
本件プログラムが、学習ステップと、対象値を学習ステップにより学習された分類基準にもとづいて15の倍数、15の倍数でない5の倍数、15の倍数でない3の倍数、3の倍数でも5の倍数でもない数、のうちのいずれか1つに分類する分類ステップとを実行させるのに対し、
引用プログラムは、対象値を、所定の数で割った時の余りに基づいて15の倍数、15の倍数でない5の倍数、15の倍数でない3の倍数、3の倍数でも5の倍数でもない数、のうちのいずれか1つに分類するステップを実行させる点。

(C)特許出願時点で公知の技術に基づいて、相違点を埋めることが容易にできたかどうか
（読み飛ばし可　ここから）
特許出願時点(というか現時点）で、サポートベクタ―マシン等の教師信号ありの機械学習アルゴリズムは公知である。
https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%99%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%9E%E3%82%B7%E3%83%B3

しかし、サポートベクタ―マシンは、 画像・音声などの雑多な情報を含むデータの中から、意味を持つ対象を選別して取り出すパターン認識処理であるところ、引用プログラムは、数字という単純な情報を処理対象としているので、引用プログラムにサポートベクターマシンを組み合わせる事は、容易に思いつかないことであると考えられる。
（読み飛ばし可　ここまで）

とすれば、本件プログラムは、引用プログラムに基づいては、容易に相当することができなかったと考えられる。
したがって、本件プログラムは、引用プログラムに鑑みて、進歩性を有する。


(4)結論
===

(3)で検討したところによれば、本件プログラムは特許を取れる可能性がある。

後で気が向いたときに、(2-2)特許をどう活用できるのか（特許を取っていくら儲かるのか、特許で何がしたいのか）、(2-3)特許取得にいくら金がかかるのかなどを書く、‥予定である。