今なら家電が全品9%OFF!

分解律: X → YZ ⇒ X → Y ∧ X → Z
擬推移律: X → Y ∧ WY → Z ⇒ XW → Z

これが成り立つことを証明したいです。
反射律、推移律、増加律の使える場合での証明方法を探しています。
これだけ教科書に載っていないので分からないのです。
合併律は証明ができましたので、合併律も利用できます。
証明の仕方を教えてください。よろしくお願いします。

A 回答 (1件)

定義は飛ばし、公理だけ.... 。


(A1) 反射律(reflexivity law) Y⊆Xのとき,X→Yが成立
(A2) 増加律(augmentation law) X→Yのとき,XZ→YZが成立
(A3) 推移律(transitivity law) X→YかつY→Zのとき,X→Zが成立


>分解律: X → YZ ⇒ X → Y ∧ X → Z

Y⊆YZ かつ Z⊆YZ だから (A1) により YZ → Y かつ YZ → Z
これと X → YZ から (A3) により X → Y かつ X → Z


>擬推移律: X → Y ∧ WY → Z ⇒ XW → Z

(A2) により X → Y のとき XW→YWが成立。
これと WY → Z が成立するから (A3) により XW → Z
    • good
    • 0
この回答へのお礼

ありがとうございました!!
とても参考になりました。

お礼日時:2007/09/25 22:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QNTP の TCPポートは?

NTPは123/UDPでようは足りると思うのですが、
WELL KNOWN PORTとかいろいろな資料に「123/TCP」ポートが割当たってます。
ntpd,ntpdate等でNTPを使う場合、実際には123/TCPは使われているのでしょうか?

Aベストアンサー

RFC1305では「ntpには123/udpを割り当てる」となっていますが、RFC1700では「123 ntp」となっており、「123/udp」と明示されているわけではありません。
よって、「123/tcp ntp」が間違っている(または使えない)という明確な根拠にはなりません。

「現状では『123/tcp ntp』を実装するための定義が存在しない」程度に考えた方が良いと思います。

ただ、将来的にRFC2030のSNTPが(IPv6対応などの点で)主流になる可能性があるので、「123/tcp ntp」は定義されない可能性もあります。

QC言語 重複しない4ケタの乱数 教えてください

以下のプログラムを使って重複しない4ケタの乱数を発生させ、数当てゲームを作りたいです。
以下のプログラムで乱数を4つ作ることができたのですが、重複してしまいます。
どのようにすればよいのですか?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
int i,d;
float f;
unsigned long time1;
unsigned seed;
time(&time1);
seed=time1;
srand(seed);
for (i=0;i<4;i++)
{
f=rand();
d=f*10/32768.0;
printf ("%d ",d);
}
}

Aベストアンサー

やりたいことは、”1ケタの数字(0~9)を4つ重複しないように乱数生成する”ですかね?
(4ケタの数字1000~9999ではないですよね?プログラムの内容的に。)

実現方法はいくつかあると思います。

案1.配列に生成した乱数を記録しておいて、
  2回目以降の乱数で抽選された数字が、
  配列に記録してある数字と一致するかチェックし、
  一致した場合は、一致しなくなるまで再度乱数生成をし直す。

  以下のプログラムは一例。(手元がC++の環境なので微妙に違うけど。)
  これが良い例というわけではないです。何かバグあるかもしれん。
int i, d;
srand((unsigned)time(NULL));
int ary[4];//生成した乱数格納用
//配列初期化、乱数で選ばれる事が無い-1を入れておく。
for (i = 0; i < 4; i++){
ary[i] = -1;
}
for (i = 0; i<4; i++)
{
while (ary[i] < 0){
d = rand() % 10;
if ((d != ary[0]) && (d != ary[1]) && (d != ary[2])){ //要素数が少ないので横着
ary[i] = d;
}
}
printf("%d ", d);
}

案2.配列(要素数10)に0~9の数字を入れておいて、
  ランダムに配列内の並び順をシャッフルして、
  その後、先頭の4つを出力する。
  参考:http://mementoo.info/archives/746


案2の方がスマートな気がしますが、せっかく途中までプログラム作ってたようなので、
案1はそれの改造版ですな。

やりたいことは、”1ケタの数字(0~9)を4つ重複しないように乱数生成する”ですかね?
(4ケタの数字1000~9999ではないですよね?プログラムの内容的に。)

実現方法はいくつかあると思います。

案1.配列に生成した乱数を記録しておいて、
  2回目以降の乱数で抽選された数字が、
  配列に記録してある数字と一致するかチェックし、
  一致した場合は、一致しなくなるまで再度乱数生成をし直す。

  以下のプログラムは一例。(手元がC++の環境なので微妙に違うけど。)
  これが良い例というわけ...続きを読む

Q構造体の要素すべてに対する四則演算の方法を教えてください.

構造体の要素すべてに対する四則演算の方法を教えてください.
たとえば、
2点a,bの座標成分x,y,zをそれぞれの座標ごとに足す方法を教えてください.
下のようにx,y,z成分を持ったa,bがあります。
struct point{
int x;
int y;
int z;
};
struct point a;
struct point b;
struct point c;

この場合,
c=a+b;
と書くことができず,
それぞれの成分ごとに以下のように足さなくてはなりません.
c.x=a.x+b.x;
c.y=a.y+b.y;
c.z=a.z+b.z;
この方法でできるのですが,
非常に効率的でないのでなにかもっと簡単に記述する方法を教えてください.
お願いいたします.

Aベストアンサー

久しくCは触ってないのですが、

>c=a+b;
>と書くことができず,
>それぞれの成分ごとに以下のように足さなくてはなりません.
>c.x=a.x+b.x;
>c.y=a.y+b.y;
>c.z=a.z+b.z;

この書き方が正しいです。
構造体の内容が同じInt型ならば、配列で宣言しておいた方が
後の手間は簡単そうです。

この記述をいちいち書くのが面倒ならば、この部分を関数化しておけば、
この処理を呼び出す際の記述は1行で済みます。
(プロの仕事のやり方というのは、そーいうもんです)

Qページングシステム

ページングシステムにおけるオーバーヘッドとは何か分かりますか?ただしTLBはMMUの中にありこの参照のオーバーヘッドは無視できるとします。

Aベストアンサー

オーバーヘッドとは、オーバーヘッドタイムのことでしょう。OSやデータベースシステムやメモリシステムなど
アプリの処理のほかに、システムを使うために止むをえず要する仕掛けを処理する必要悪の時間のことを言う。
「ページングシステムにおける」であれば、ページングシステムが何をするシステムか、どう言うことをするのかが判れば、その処理をする時間であるわけです。
簡単には
http://yougo.ascii24.com/gh/05/000536.html
http://ew.hitachi-system.co.jp/w/E3839AE383BCE382B8E383B3E382B0-2.html
に記されているようなもので、ウインドウズであれば
http://www.din.or.jp/~charade/committee2/06.html
などに例が載っています。LINUXでは
http://japan.linux.com/kernel/internal24/node176.shtml
メモリをページと言うセグメントで区切りその単位で、検索し、読みこみ書き込みを行うシステムの場合、そのための処理時間(仮想ページと実メモリ間のページ変換やスワップなど)が相対的に無視できない時に、オーバーヘッドタイムとして問題になる。
http://kescriv.kj.yamagata-u.ac.jp/akihisa/sotu331.html
http://kescriv.kj.yamagata-u.ac.jp/akihisa/sotu333.html
ページは通信でも「ポケットベルは商品名であり、英語では本来「ページャー(Pager)」と呼んでいる」というところにも現れている。
http://www.interq.or.jp/blue/rhf333/K-HIST.htm

オーバーヘッドとは、オーバーヘッドタイムのことでしょう。OSやデータベースシステムやメモリシステムなど
アプリの処理のほかに、システムを使うために止むをえず要する仕掛けを処理する必要悪の時間のことを言う。
「ページングシステムにおける」であれば、ページングシステムが何をするシステムか、どう言うことをするのかが判れば、その処理をする時間であるわけです。
簡単には
http://yougo.ascii24.com/gh/05/000536.html
http://ew.hitachi-system.co.jp/w/E3839AE383BCE382B8E383B3E382B0-2.htm...続きを読む

Q第2正規化と第3正規化の違い

第2正規化と第3正規化の違い(区別)が分かりません。
わかりやすい説明もしくは,わかりやすい説明の載っている参考書など紹介してもらえないでしょうか。お願いします。

Aベストアンサー

http://www.kogures.com/hitoshi/webtext/db-seikika/index.html
http://www2s.biglobe.ne.jp/~coach/onepoint/database/db_seiki.html

簡単にいうとキー項目以外のデータ項目で他テーブルの主キーとなる項目を抜き出すのがそうです。

QC言語で構造体のメンバを簡単に出力する方法ありますか?

いつもお世話になっています。

C言語の質問です。
単体テストログを取るために、
“関数Aをコールする前後で、関数Aに引数として渡す構造体のメンバをすべて”printf(もしくはfprintf)で出力して比較確認しなければならないのですが、

構造体のメンバが250とか、150とかあり、メンバ名もxxx_01,xxx_02などのようにエクセルなどで簡単に加工して作れるものではないので、いちいちメンバ名を指定しなければならないのでとても大変です。

オブジェクト指向言語なら、for each文とかでオブジェクトのメンバを簡単に取り出せるのでしょうが(間違っているかもしれません・・・)、C言語で構造体のメンバを、for文などのループを使って簡単に出力できる方法はないでしょうか?

メンバの型は、一定ではなく、char、int、double、別の構造体のポインタ型(これは出力しなくて良い)と混在しています。メンバが全て同一の型ならポインタで構造体の先頭アドレスからsizeof(メンバの型)の分インクリメントしていけば出力できそうな気もしますが、メモリ上に連続して確保されるのかも私にはわからないので困っています。

enumで列挙して・・・というのも調べてみましたが、応用は出来ないようでした。

どなたか、地道にメンバ名を書いて出力する以外の方法をご存知の方、いらっしゃいましたらお知恵をお貸しください。
よろしくお願いいたします。
※説明不足の点がありましたら補足いたします。

いつもお世話になっています。

C言語の質問です。
単体テストログを取るために、
“関数Aをコールする前後で、関数Aに引数として渡す構造体のメンバをすべて”printf(もしくはfprintf)で出力して比較確認しなければならないのですが、

構造体のメンバが250とか、150とかあり、メンバ名もxxx_01,xxx_02などのようにエクセルなどで簡単に加工して作れるものではないので、いちいちメンバ名を指定しなければならないのでとても大変です。

オブジェクト指向言語なら、for each文とかでオブジェクトのメンバを...続きを読む

Aベストアンサー

コードを書かないという方向性の提案を一つ。
デバッガに構造体の内容を出力させるというのはどうでしょうか。

struct {
int a;
char *b;
double c;
}
という型を持つ変数xがあったとして、gdbでは下記のような出力が得られます。
(gdb) print x
$1 = {
a = 123,
b = 0x2fd0 "ABC",
c = -9876.5
}

Q自明な関数従属について

自明な関数従属で2点意味がわからず困っております。

1点目:「属性集合X、Yにおいて、YがXの部分集合であるとき、X →Yが必ず成立する。」この場合を自明な関数従属という。
と記述がありました。
この「X→Yが成立する」部分が、理解できないのです。

試しに
Xが{1,2,3,4,5}
Yが{1,2,3}
と考えてみたのですが、X→Yになる理由がわからないのです。

2点目:また、上の例として以下の項目が挙げられていました。
学生番号、科目が{学生番号、科目}の部分集合(真部分集合)である場合、
自明な関数従属性で、
{学生番号、科目}→学生番号、
{学生番号、科目}→科目
が必ず成立する。とありました。

この例に値を入れて考えてみたのですが、学生番号、科目が
導き出されるのかわかりません。
{学生番号、科目}→学生番号
で考えると、
{10001、数学}→10001
になると思うのですが、この「数学」という値を利用すると10001が
出ることになるのかわからないのです。

どなたか以上2点について解決できる策をお持ちの方が
いらっしゃいましたらご教授のほうよろしくお願いします。

自明な関数従属で2点意味がわからず困っております。

1点目:「属性集合X、Yにおいて、YがXの部分集合であるとき、X →Yが必ず成立する。」この場合を自明な関数従属という。
と記述がありました。
この「X→Yが成立する」部分が、理解できないのです。

試しに
Xが{1,2,3,4,5}
Yが{1,2,3}
と考えてみたのですが、X→Yになる理由がわからないのです。

2点目:また、上の例として以下の項目が挙げられていました。
学生番号、科目が{学生番号、科目}の部分集合(真部分集合)である場合、
自明な関数従属...続きを読む

Aベストアンサー

1点目
X、Yは属性ですので属性っぽいものを例にします。
X=学生番号、Y=学生氏名としたとき、
学生番号→学生氏名が成立する、
言い換えると、学生番号が決まれば、学生氏名が定まる。
(この例は、X:学生番号が真部分集合)

2点目
学生番号、科目が{学生番号、科目}の真部分集合、要は学生番号、科目2つでキーということですよね。
この場合もそれぞれ言い換えると、下記のようになります。

{学生番号、科目}→学生番号
学生番号と科目が決まれば、学生番号が定まる。

{学生番号、科目}→科目
学生番号と科目が決まれば、科目が定まる。

※断言調で書きましたが、だいぶ前に勉強したっきりなのでちょっと
自信なしです…

Qテキストファイルから文字列を読み込んで二次元配列に格納するには

毎回お世話になっています。

ただいまC言語を勉強中の学生です。

基本的な文法は頭に入れたつもりでしたが、まだポインタと ファイルの入出力に苦手意識があり 実際うまくできないでいるので

どなたか ご存知の方にアドバイスいただければと思って書き込ませていただきます。

今回練習しているのは 先に述べたように、テキストファイルに

abc
def
ghi
jkl

などと文字列を書いておき、そのファイルを読み込んで
二次元配列に格納したいのですが、何を勘違いしているのか、
うまく実現できません。

参考書などを見て 一次元配列へ格納する場合は できたようなのですが、今後このプログラムを発展させる段階で 二次元配列に文字列を
格納できたほうが好都合なので 今模索しています。。。

ちなみに 一次元配列に格納する場合は 以下のように書きました。


#include<stdio.h>
#include<stdlib.h>

main()
{
char a[10];

FILE *fp;

fp = fopen("word.dat", "r");

if (fp == NULL)
{
printf("File does not exist.\n");
exit(1);
}

while(fscanf(fp,"%s",a)==1){
printf("%s\n",a);
}

fclose(fp);

return 0;
}

実はコレに関しても分からない点があり、それは 目的の配列変数
a[]に格納できたのだから それを確認したいと思い
printfで a[0]~a[10]を表示してみようとしたところ 変に文字化け
したものが表示されたり、何も表示されなかったり よく分からないことが起きます。私は何を勘違いしてしまっているのでしょうか(>_<)

長々と書いてしまいましたが、今回 御教授いただきたいのは

(1)、テキストファイルから 英字の文字列を読み込んで二次元配列に格納するために用いるのに 一番最適な関数はどれか(fscanfやfgetsなど) そして、その関数を使って 一番シンプルな記述をするにはどのように記述すればよいのか

(2)、上のようなプログラムの書き方で、配列aにテキストファイルから読み込んで格納できたようなのに、a[0]~a[10]をprintfしたときに
うまく中身が表示されないのはなぜか。

という点なのですが、(1)をとりあえず急いでおりますので、(2)はおまけ程度に考えていただければと思います。

なぜかファイルの入出力がいまだに把握できなくて苦手としておりますので、どうか よろしくお願いいたします。

毎回お世話になっています。

ただいまC言語を勉強中の学生です。

基本的な文法は頭に入れたつもりでしたが、まだポインタと ファイルの入出力に苦手意識があり 実際うまくできないでいるので

どなたか ご存知の方にアドバイスいただければと思って書き込ませていただきます。

今回練習しているのは 先に述べたように、テキストファイルに

abc
def
ghi
jkl

などと文字列を書いておき、そのファイルを読み込んで
二次元配列に格納したいのですが、何を勘違いしているのか、
うまく実現...続きを読む

Aベストアンサー

#include <stdio.h>
int
main(void)
{
char a[10][10];
int i, maxi;
FILE *fin;

if ((fin = fopen("test.dat", "r")) == NULL){
fprintf(stderr, "Can't open file\n");
}
for (i = 0; i<10; i++) {
if (fgets(a[i], 10, fin) == 0) {
maxi = i;
break;
}
}
for (i = 0; i < maxi; i++) {
printf("a[%d] = %s", i, a[i]);
}

fclose(fin);
return 0;
}

Q戻り値の意味がわかりません…

戻り値とはどういう値なのか簡単な例文で教えて頂けますか?

Aベストアンサー

バカくさいかもしれませんが簡単な例えをだしてみます。
2人の子供がいて、名前をそれぞれ太郎・花子にしましょう。この2人の子にある役割を決めます。
・花子は飴をもらうと、それをチョコにする役割。(できるかは別として)
・太郎は花子を呼んで飴をあげる役割。

さてこの例では太郎の飴が引数(ひきすう)になり
花子のチョコが戻り値になります。

このイメージを元に次の文を読んでみてください。

「プログラム中の関数やサブルーチンが処理を終了し
呼び出し元に処理の結果として返す値。」

これが戻り値の正しい定義です。
そのほかにはNo1さんのような役割指すときも、それを「戻り値」と呼んだりします。

Q⊆この記号の意味は?

A⊆BとあったときA,Bはどういう関係なんですか?
⊆で検索してみたのですが、一件もヒットしません。こういった記号は検索対象外なんですね。

Aベストアンサー

「数学記号」で検索してみるのが良いと思います。
私は数学はサッパリなのですが、
顔文字等に使われる記号が気になって調べることがあります。
下記のHPによると、集合論の記号で

「S ⊆ T」は S が T の部分集合であることを意味する。必要に応じて「T ⊇ S」とも書く。他も同じ。

とのことです。

参考URL:http://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E8%A8%98%E5%8F%B7%E3%81%AE%E8%A1%A8


人気Q&Aランキング