: Maxima数学I自習教材開発
教材の概要
1数と式 4) 集合と命題
9.集合
10.命題と条件
11.命題とその逆・裏・対偶
12.命題と証明
104.補充問題・章末問題

Maxima数学I自習教材試行報告用紙(Word)
Maxima数学I自習教材試行報告用紙(PDF)
Maxima数学I自習教材試行報告用紙(html)

課題(報告)提出フォーム

教材の概要

活動時間 
 自宅での予習か授業初めの5分程度
活動概要
 1 タブレット等を用いてトライ
  1) 教科書の該当ページを開く
  2) このWebページを開く
  3) Maxima on lineのWebページを開く
  4) 該当コマンドをMaximaOnLineにコピペして、実行
 2 自分なりの感触、着想
  1) 自分なりに、実行結果を考察する
  2) ワークシートに、考察したこと(意見・質問・感じたこと)を書く
 3 問題の雰囲気を2で感じてから、授業へ
  1) 班活動などで自分の考察を仲間に伝える
  2) 仲間の考察を受け止める
  3) 筋が通って、見通しが効いた解法をまとめる


参照テキスト
 数研出版新編数学I

第1章数と式
 第4節 集合と命題
:  9.集合
   A 集合と要素
▼コマンド番号901
●例30
要素・属する●●●●●●●●●●●●●●●●
kill(all) /* "901 有限集合の要素" */$
(MONDAI:"901 次のAとxについて",
A:{2,3,5,7} /* "集合Aに" */,
x:2 /* "xは属するか(◆修正部分)" */
)$
(SHORI:"",
d:"#E",
for a in A do
/**/if x=a then
/*........*/(print(x ,"=" ,a),
/*........*/d:"E")
/*....*/else
/*........*/print(x ,"#" ,a) /* "一致する要素は、=" */,
ansl:[x,d,"A","結論"],print(ansl) /* "◆属する(E)か否(#E)かの判定◆" */
)$

◎「E」は「属する」という記号とする。
 「#∈」を「属さない」という記号とする。
 Maximaでは処理系によって出力できる記号に制約があることによる。
 「#」を「否定」の記号とする。
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
x:4 /* "xは属するか(◆修正部分)" */


▼コマンド番号902
●練習53
要素の条件で表現した集合の要素●●●●●●●●●●●●●●●●
kill(all) /* "902 素の条件で表現した集合の要素" */$
(MONDAI:"902 次のAとxについて",
A:{[M,"|",[M >0 ,mod(M,2)=1]]} /* "集合Aに" */,
x:6 /* "xは属するか(◆修正部分)" */
)$
(SHORI:"",
d:"E",
sA:setify(first(A)[3]),print(sA),
for a in sA do
/**/if subst(M=x,a) then print(x,"ok",a)
/*....*/else (print(x,"no",a),d:"#E") /* "すべての条件を満たすか" */,
ansl:[x,d,"A","結論"],print(ansl) /* "◆◆属する(E)か否(#E)かの判定◆◆" */
)$

◎要素をすべて書き出せない無限集合でも、要素の条件で表現できる。
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
x:-3 /* "xは属するか(◆修正部分)" */


   B 集合の表し方
▼コマンド番号903
●例31
要素の列挙●●●●●●●●●●●●●●●●
kill(all) /* "903 要素の列挙" */$
(MONDAI:"903 次のaとAについて",
a:18,A:{[M>0 ,"|" ,[M >0,mod(a,M)=0]]} /* "「正で18の約数」という集合Aの(◆修正部分)" */,
aA:[] /* "要素を書き並べると" */)$
(SHORI*"", A3:first(A)[3],
sA:setify(A3),
for b:1 thru a do(
/**/d:"E",
/**/for c in sA do(
/*....*/if subst(M=b,c) then print(b,"ok to",c) else d:"#E"
/*....*/),
/**/if d="E" then aA:endcons(b,aA)),
aA:setify(aA),ansl:[aA,"要素で表したA","答え"],print(ansl)
)$

◎無限集合は要素をすべて並べることはできないので、条件式で表現する。
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
a:20,A:{[M,"|",[M >0 ,M <=a ,mod(M,2)=0]]} /* "「20以下で正の2の倍数」という集合A(◆修正部分)" */,


▼コマンド番号904
●練習54
要素の列挙●●●●●●●●●●●●●●●●
kill(all) /* "904 要素の列挙" */$
(MONDAI:"904 次のAについて",
a:12,A:{[M,"|",[M>0 ,mod(12,M)=0]]} /* "「12の正の約数」という集合Aは(◆修正部分)" */,
aA:[] /* "要素を書き並べると" */
)$
(SHORI:"",
A3:first(A)[3],
sA:setify(A3),
for b:1 thru a do( /* "aまでの自然数で考える(◆修正時訂正)" */
/**/d:"E",
/**/for c in sA do(
/*....*/if subst(M=b,c) then print(b,"ok to",c) else d:"#E"
/*....*/),
/**/if d="E" then aA:endcons(b,aA)),
aA:setify(aA),ansl:[aA,"答え"],print(ansl)
)$

◎無限集合は要素をすべて並べることはできないので、条件式で表現する。
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
a:30,A:{[M ,"|" ,[M >0 ,M <=30 ,mod(M,2)=1]]} /* "「30以下の正の奇数」という集合Aは(◆修正部分)" */,


▼コマンド番号905
●例32
要素の条件●●●●●●●●●●●●●●●●
kill(all) /* "905 要素の条件" */$
(MONDAI:"905 次のBについて",
a:18,B:{[M,"|",[M>0 ,mod(a,M)=0]]} /* "「正で18の約数」という集合Bは(◆修正部分1)" */,
aB:{} /* "要素でBを表すと" */
)$
(SHORI:"",
sB:setify(first(B)[3]),
for c : 1 thru a do( /* "aまでの自然数で考える" */
/**/d:"E",
/**/for b in sB do
/*....*/if subst(M=c,b) then
/*............*/print(c,"ok",b)
/*........*/else
/*............*/d:"#E",
/**/if d="E" then aB:adjoin(c,aB) /* "条件を満たせば aBに加える(◆修正部分2)" */
/**/),
ansl:[aB,"答え"],print(ansl) /* "" */ )$


◎for文で18以下の自然数を作り出し、Bの条件に、その他満たすべきものを並べている。
 修正時の変更では、adjoin(a,A)の部分を工夫して、修正する。
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
a:10,B:{[2*M ,"|" ,[M>0 ,M<=a ,mod(M,1)=0]]} /* "「10以下の正の整数を2倍したもの」という集合Bは(◆修正部分1)" */,
/**/if d="E" then aB:adjoin(2*c,aB) /* "条件を満たせば、2倍したものを、aBに加える(◆修正部分2)" */


▼コマンド番号906
●練習55
要素の条件●●●●●●●●●●●●●●●●
kill(all) /* "906 要素の条件" */$
(MONDAI:"906 次のBについて",
a:10,B:{[M,"|",[M>0 ,M<=a ,mod(M,2)=1]]} /* "「正で、10以下の整数で、奇数のもの」という集合Bは(◆修正部分1)" */,
aB:{} /* "条件を満たす要素を並べて表すと" */
)$
(SHORI:"",
INF:"" /* "無限の要素の書き並べになるなら「True」(◆修正部分2)" */,
sB:setify(first(B)[3]),
for c : 1 thru a do( /* "aまでの自然数で考える" */
/**/d:"E",
/**/for b in sB do
/*....*/if subst(M=c,b) then /* "" */
/*............*/print(c,"ok",b)
/*........*/else
/*............*/d:"#E",
/**/if d="E" then aB:adjoin(c,aB) /* "条件を満たせば aBに加える(◆修正部分3)" */
/**/),
if INF="True" then aB:adjoin("...",aB),
ansl:[aB,"答え"],print(ansl) /* "aBに集めたもの" */
)$


◎for文で18以下の自然数を作り出し、Bの条件を満たすものを書き並べている。
 修正時の変更では、M=aの部分を工夫して、修正する。
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
a:10,B:{[2*M +1,"|",[M>0 ,mod(M,1)=0]]} /* "「正の整数のものを、2倍して1加えたもの」という集合Bは(◆修正部分1)" */,
INF:"True" /* "無限の要素の書き並べになるなら「True」(◆修正部分2)" */,
/**/if d="E" then aB:adjoin(2*c+1,aB) /* "条件を満たせば、aBに加える(◆修正部分3)" */


   C 部分集合
▼コマンド番号907
●例33
包含・相等●●●●●●●●●●●●●●●●
kill(all) /* "907 包含・相等" */$
(MONDAI:"907 次のA,Bについて",
A:{1,2,3,6},
B:{1,2,3,4,6,12} /* "包含(C)か・相等(=)か(◆修正部分)" */
)$
(SHORI1:"ACB",
dAB:"C",
for a in A do /* "Aの要素は" */
/**/if elementp(a,B) then /* "Bの要素(E)か" */
/*........*/print(a,"E","B")
/*....*/else(
/*........*/print(a,"#E","B"),
/*........*/dAB:"#C"
/*........*/),
ansl1:[["A",dAB,"B"],"答え"],print(ansl1) /* "◆AはBに含まれるか(包含 C)◆" */
)$
(SHORI2:"BCA",
dBA:"C",
for b in B do /* "Bの要素は" */
/**/if elementp(b,A) then /* "Aの要素(E)か" */
/*........*/print(b,"E","A")
/*....*/else(
/*........*/print(b,"#E","A"),
/*........*/dBA:"#C"
/*........*/),
ansl2:[["B",dBA,"A"],"答え"],print(ansl2) /* "◆AはBに含まれるか(包含 C)◆" */
)$
(SHORI3:"B=A",
if dAB="C" and dBA="C" then ansl3:[["A","=","B"],"答え"]
/**/elseif dAB="C" and dBA="#C" then ansl3:[["A","C","B"],"答え"]
/**/elseif dAB="#C" and dBA="C" then ansl3:[["B","C","A"],"答え"]
/**/else ansl3:[["A","包含関係なし","B"],"答え"]/* "◆AとBの包含関係は◆" */,
print(ansl3)
)$


◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
B:{1,2,3,6} /* "包含(C)か・相等(=)か(◆修正部分)" */


▼コマンド番号908
●練習56
包含・相等●●●●●●●●●●●●●●●●
kill(all) /* "908 包含・相等" */$
(MONDAI:"908 次のA,Bについて",
A:{1,2,5,10} /* "(◆修正部分)" */,
a:10,B:{[M ,"|" ,[M>0 ,M<=a ,mod(M,1)=0]]} /* "包含(C)か・相等(=)か(◆修正部分)" */
)$
(SHORI1:"ACB", sB:setify(first(B)[3]) /* "Bの条件は" */,
dAB:"C",
for a in A do( /* "Aの要素は" */
/**/for b in sB do /* "Bの条件を満たす(E)か" */
/*....*/if subst(M=a,b) then
/*............*/print(a,"OK","B",b)
/*........*/else(
/*............*/print(a,"NG","B",b),
/*............*/dAB:"#C"
/*............*/)),
ansl1:[["A",dAB,"B"],"答え"] /* "◆AはBに含まれるか(包含 C)◆" */,print(ansl1)
)$
(SHORI2:"BCA", dBA:"C",
for i: 1 thru a do( /* "aまでの自然数で考える" */
/**/print(i),
/**/d:"ok",
/**/for b in sB do /* "Bの条件を満たすものは" */
/*....*/if subst(M=i,b) then
/*............*/print(i,"OK","B",b)
/*........*/else(
/*............*/print(i,"NG","B",b),
/*............*/d:"ng"),
/**/print(d),
/**/if d="ok" then(
/*....*/if elementp(i,A) then/* "Aの条件を満たすか" */
/*............*/print(i,"E","A")
/*........*/else(
/*............*/print(i,"#E","A"),
/*............*/dBA:"#C"))),
ansl2:[["B",dBA,"A"],"答え"] /* "◆BはAに含まれるか(包含 C)◆" */,print(ansl2)
)$
(SHORI3:"B=A", if dAB="C" and dBA="C" then ansl3:[["A","=","B"],"答え"]
/**/elseif dAB="C" and dBA="#C" then ansl3:[["A","C","B"],"答え"]
/**/elseif dAB="#C" and dBA="C" then ansl3:[["B","C","A"],"答え"]
/**/else ansl3:[["A","包含関係なし","B"],"答え"] /* "◆AとBの包含関係は◆" */,print(ansl3)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
A:{1,2,4,8} /* "(◆修正部分)" */,
a:8,B:{[M ,"|" ,[M>0 ,mod(a,M)=0]]} /* "包含(C)か・相等(=)か(◆修正部分)" */


▼コマンド番号909
●例34
部分集合●●●●●●●●●●●●●●●●
kill(all) /* "909 部分集合" */$
(MONDAI:"909 次のAについて",
A:{a,b} /* "部分集合をすべて挙げると(◆修正部分)" */
)$
(SHORI:"",
ansl:[powerset(A),"答え"] /* "◆すべての部分集合◆" */,print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
A:{1,2,4} /* "部分集合をすべて挙げると(◆修正部分)" */


▼コマンド番号910
●練習57
部分集合●●●●●●●●●●●●●●●●
kill(all) /* "910 部分集合" */$
(MONDAI:"910 次のAについて",
A:{1,2} /* "部分集合をすべて挙げると(◆修正部分)" */
)$
(SHORI:"",
ansl:[powerset(A),"答え"] /* "◆すべての部分集合◆" */,print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
A:{a,b,c} /* "部分集合をすべて挙げると(◆修正部分)" */


   D 共通部分と和集合
▼コマンド番号911
●例35
共通部分と和集合●●●●●●●●●●●●●●●●
kill(all) /* "911 共通部分と和集合" */$
(MONDAI:"911 次のA,Bについて",
A:{1,2,3,6} /* "Aと(◆修正部分)" */,
B:{2,4,6,8,10} /* "Bとの共通部分と和集合は(◆修正部分)" */
)$
(SHORI:"",
AnB:intersection(A,B) /* "◆共通部分◆" */,
AuB:union(A,B) /* "◆和集合◆"*/,ansl:[AnB,AuB,"共通部分、和集合"],print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
A:{o,s,a,k} /* "Aと(◆修正部分)" */,
B:{k,a,n,s,i} /* "Bとの共通部分と和集合は(◆修正部分)" */


▼コマンド番号912
●練習58
共通部分と和集合●●●●●●●●●●●●●●●●
kill(all) /* "912 共通部分と和集合" */$
(MONDAI:"912 次のA,Bについて"/*(◆修正部分1)*/,
A:{1,2,3,4,5,6,7} /* "Aと(◆修正部分1)" */,
B:{2,4,6,8} /* "Bとの共通部分と和集合は(◆修正部分1)" */
)$
(SHORI:"",
AnB:intersection(A,B) /* "◆共通部分◆(◆修正部分2)" */,
AuB:union(A,B) /* "◆和集合◆"*/,ansl:[AnB,AuB,"共通部分、和集合"],print(ansl)/*(◆修正部分2)*/
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
(MONDAI:"912 次のA,Bについて"/*(◆修正部分1)*/,
B:{2,4,6,8} /* "Bとの共通部分と和集合は(◆修正部分1)" */,
C:{1,3} /* "●BとCの共通部分と和集合は●(◆修正部分1)" */
BnC:intersection(B,C) /* "◆共通部分◆(◆修正部分2)" */,
BuC:union(B,C) /* "◆和集合◆"*/,ansl:[BnC,BuC,"共通部分、和集合"],print(ansl)/*(◆修正部分2)*/


▼コマンド番号913
●練習59
共通部分と和集合●●●●●●●●●●●●●●●●
kill(all) /* "913 共通部分と和集合(Maxima on lineの場合、削除すること)" */$
(MONDAI:"913 次のA,Bについて、共通部分は" /* (◆修正部分1) */,
A:{[x,"|",[0< x,x< 2]]} /**/,
B:{[x,"|",[1<=x,x<=4]]} /**/
)$
(TEISUU:"",
xL:5/*-xL< x< xLで考察*/
)$
(KANSUU:"",
append1(aI,f,fX,gX):=(/*print(aI,"/f",f,"/fX",fX,"/gX",gX),*/
/**/gX:append(fX,gX) /* "aIは0で開(1で閉)区間合成設定、fは区間合成関数、fX,gXは端点リスト(L)" */,
/**/fX:[],
/**/for i:1 thru length(gX) do(
/*....*/xX:gX[i][1],gx:subst(x=xX,f),
/*....*/if (ev(gx,nouns,numer)=aI and xX#xL) or xX=xL then fX:endcons(gX[i],fX) /* "重複端点削除" */
/*....*//*,print(i,"/aI",aI,"/f",f,"/gX",gX,"/xX",xX,"/gx",gx,"/xL",xL,"/fX",fX)*/),fX
/**/) /* "端点設定" */,
cL(x,a):= (cLL: [a< x,[a,1],[xL,0]],if cLL[1] then 1 else 0) /* {a< x}の特性・端点[左開端点条件,開端点,閉端点([xL,0]ダミー)]設定、特性関数 */,
ceL(x,a):=(ceLL:[a<=x,[xL,0],[a,1]],if ceLL[1] then 1 else 0) /* {a<=x}の特性・端点[左閉端点条件,開端点([xL,0]ダミー),閉端点]設定、特性関数 */,
cR(x,a):= (cRL: [x< a,[a,1],[xL,0]],if cRL[1] then 1 else 0) /* {x< a}の特性・端点[右開端点条件,開端点,閉端点([xL,0]ダミー)]設定、特性関数 */,
ceR(x,a):=(ceRL:[x<=a,[xL,0],[a,1]],if ceRL[1] then 1 else 0) /* {x<=a}の特性・端点[右閉端点条件,開端点([xL,0]ダミー),閉端点]設定、特性関数 */
)$
(SHORI:"1",
cA:cL(x,0)*cR(x,2),cAI:append1(0,cA,[cLL[2]],[cRL[2]]),cAE:append1(1,cA,[cLL[3]],[cRL[3]]) /* 区間A(0,2)の特性関数、端点(引数(0開(1閉)),cA区間関数,cAI開端点L、cAE閉端点L、[xL,0]はダミー) */,
cB:ceL(x,1)*ceR(x,4),cBI:append1(0,cB,[ceLL[2]],[ceRL[2]]),cBE:append1(1,cB,[ceLL[3]],[ceRL[3]]) /* "区間B[1,4]の特性関数、端点(引数(0開(1閉)),cB区間関数、cBIは開端点L、cBEは閉端点L、[xL,0]はダミー)" */,
cAnB:cA*cB,cAnBI:append1(0,cAnB,cAI,cBI),cAnBE:append1(1,cAnB,cAE,cBE) /* "AnBの数直線表示データ(特性関数、端点)(◆修正部分2)" */,
wxdraw2d(yrange=[-3,3],explicit(0.3*cA,x,-xL,xL)/*(◆修正部分2)*/,
/**/point_type=6,points(cAI),point_type=7,points(cAE)/*(◆修正部分2)*/,
/**/color=black,explicit(0.6*cB,x,-xL,xL)/*(◆修正部分2)*/,
/**/point_type=6,points(cBI),point_type=7,points(cBE)/*(◆修正部分2)*/,
/**/color=red,explicit(cAnB,x,-xL,xL)/*(◆修正部分2)*/,
/**/point_type=6,points(cAnBI),point_type=7,points(cAnBE)/*(◆修正部分2)*/,
/**/color=white,point_type=7,points([[xL,0]])/**/
/**/) /* "数直線表示(赤の部分)" */,
print("A ",cAI,",",cAE," B",cBI,",",cBE,"各端点、開、閉") /* "次のグラフ(赤)とこの出力を見て、求める解を以下に書き込む" */
)$
(SHORI:"2",
ansl:["AnB:",{[x,"|",[1<= x,x< 2]]},"答え"],print(ansl)/* "(◆修正部分3)" */,
F:ceL(x,1)*cR(x,2),FI:[[2,1]],FE:[[1,1]] /* "特性関数、開端点L、閉端点L" *//* "(◆修正部分3)" */,
wxdraw2d(yrange=[-3,3],
/**/color=red,explicit(F,x,-xL,xL),point_type=6,points(FI),point_type=7,points(FE),
/**/color=white,point_type=7,points([[xL,0]])
/**/) /* "数直線表示(赤の部分)" */
)$

◎「A∩B、A∪B」のことを、「AnB、AuB」で表す。
◎実数の区間に関する集合Aの処理は、特性関数cA(x)(区間上で1、区間外で0の値をとる関数)によると簡単になる。
 AnBはcA*cB、AuBはcA+cB-CA*cBとなる。
 
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
(MONDAI:"913 次のA,Bについて、和集合は" /* (◆修正部分1) */,
cAnB:cA*cB,cAnBI:append1(0,cAnB,cAI,cBI),cAnBE:append1(1,cAnB,cAE,cBE) /* "AnBの数直線表示データ(特性関数、端点)(◆修正部分2)" */,
cAuB:cA+cB-cAnB,cAuBI:append1(0,cAuB,cAI,cBI),cAuBE:append1(1,cAuB,cAE,cBE) /* "AuBの数直線表示データ(特性関数、端点)(◆修正部分2)" */,
wxdraw2d(yrange=[-3,3],explicit(0.3*cA,x,-5,5)/*(◆修正部分2)*/,
point_type=6,points(cAI),point_type=7,points(cAE)/*(◆修正部分2)*/,
color=black,explicit(0.6*cB,x,-5,5),point_type=6,points(cBI),point_type=7,points(cBE)/*(◆修正部分2)*/,
color=red,explicit(cAuB,x,-5,5),point_type=6,points(cAuBI),point_type=7,points(cAuBE)/*(◆修正部分2)*/,
ansl:["AuB:",{[x,"|",[0< x,x<= 4]]},"答え"],print(ansl)/* "(◆修正部分3)" */,
F:cL(x,0)*ceR(x,4),FI:[[0,1]],FE:[[4,1]] /* "特性関数、開端点L、閉端点L" *//* "(◆修正部分3)" */,


   E 補集合
▼コマンド番号914
●例36
補集合●●●●●●●●●●●●●●●●
kill(all) /* "914 補集合" */$
(MONDAI:"914 次の全体集合UとAについて(◆修正部分)",
U:{1,2,3,4,5,6},
A:{1,2,3} /* "Aの補集合は(◆修正部分1)" */
)$
(SHORI:"", Xc:{},
for u in U do
/**/if elementp(u,A) then print(u,E,A) /*"(◆修正部分2)" */
/*....*/else(Xc:adjoin(u,Xc),
/*........*/print(Xc)),
ansl:["Ac:",Xc,"答え"],print(ansl) /* "(◆修正部分3)" */
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
(MONDAI:"914 次の全体集合UとA,Bについて(◆修正部分)",
A:{1,2,3} /* "(◆修正部分1)" */,
B:{3,6} /* "(◆修正部分1)" */,
AuB:union(A,B) /* "AuBの補集合は(◆修正部分1)" */
/**/if elementp(u,AuB) then print(u,E,AuB) /*"(◆修正部分2)" */
ansl:["IAuBIc:",Xc,"答え"],print(ansl) /* "(◆修正部分3)" */


▼コマンド番号915
●練習60
補集合●●●●●●●●●●●●●●●●
kill(all) /* "915 補集合" */$
MONDAI:"915 次の全体集合Uと下のA,Bについて"$
U:{1,2,3,4,5,6};
cU(S):=( /**/C:{}, /**/for u in U do
/*....*/if elementp(u,S) then print(u,E,S)
/*........*/else C:adjoin(u,C),
/**/C /* "Uで補集合をとる関数" */)$
A:{1,2,3};
B:{3,6};
AnB:intersection(A,B) /* "AnBの補集合は(◆修正部分)" */;
AnBc:cU(AnB) /*"(◆修正部分)" */;
print(AnBc) /* "◆求める解◆(▲修正時変更)" */

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
Ac:cU(A) /* "(◆修正部分)" */;
Bc:cU(B) /* "(◆修正部分)" */;
AcuBc:union(Ac,Bc) /* "(◆修正部分)" */;


▼コマンド番号916
●練習61
共通部分と和集合●●●●●●●●●●●●●●●●
kill(all) /* "916 共通部分と和集合(Maxima on lineの場合、削除すること)" */$
MONDAI:"916 次の全体集合Uと下のA,Bについて"$
xL:5;
append1(aI,f,fX,gX):=(print(aI,"/f",f,"/fX",fX,"/gX",gX),
/**/gX:append(fX,gX) /* "aIは0で開(1で閉)区間合成設定、fは区間合成関数、fX,gXは端点L" */,
/**/fX:[],
/**/for i:1 thru length(gX) do(
/*....*/xX:gX[i][1],gx:subst(x=xX,f),
/*....*/if (ev(gx,nouns,numer)=aI and xX#xL) or xX=xL then fX:endcons(gX[i],fX) /* "重複端点削除" */,
/*....*/print(i,"/aI",aI,"/f",f,"/gX",gX,"/xX",xX,"/gx",gx,"/xL",xL,"/fX",fX)),
/**/fX) /* "端点設定" */;
cL(x,a):= (cLL: [a<x ,[a,1],[xL,0]],if cLL[1] then 1 else 0) /* "[左開端点条件,開端点,閉端点([xL,0]ダミー)]、{a<x}の特性関数" */;
ceL(x,a):=(ceLL:[a<=x,[xL,0],[a,1]],if ceLL[1] then 1 else 0) /* "[左閉端点条件,開端点([xL,0]ダミー),閉端点]、{a<=x}の特性関数" */;
cR(x,a):= (cRL: [x<a ,[a,1],[xL,0]],if cRL[1] then 1 else 0) /* "[右開端点条件,開端点,閉端点([xL,0]ダミー)]、{x<a}の特性関数" */;
ceR(x,a):=(ceRL:[x<=a,[xL,0],[a,1]],if ceRL[1] then 1 else 0) /* "[右閉端点条件,開端点([xL,0]ダミー),閉端点]、{x<=a}の特性関数" */;
cA:cL(x,0)*cR(x,2);cAI:append1(0,cA,[cLL[2]],[cRL[2]]);cAE:append1(1,cA,[cLL[3]],[cRL[3]]) /* "区間A(0,2)の数直線表示データ" */;
cB:ceL(x,1)*ceR(x,4);cBI:append1(o,cB,[ceLL[2]],[ceRL[2]]);cBE:append1(1,cB,[ceLL[3]],[ceRL[3]]) /* "区間B[1,4]の数直線表示データ" */;
cAnB:cA*cB;cAnBI:append1(0,cAnB,cAI,cBI);cAnBE:append1(1,cAnB,cAE,cBE) /* "AnBの数直線表示データ(◆修正部分)" */;
cAnBc:1-cAnB;cAnBcI:cAnBE;cAnBcE:cAnBI /* "(AnB)cの数直線表示データ(◆修正部分)" */;
F:cAnBc;FI:cAnBcI;FE:cAnBcE /* "(AnB)cの特性関数、開端点、閉端点(◆修正部分)" */;
wxdraw2d(yrange=[-3,3],explicit(0.25*cA,x,-5,5),
/**/point_type=6,points(cAI),point_type=7,points(cAE),
/**/color=black,explicit(0.5*cB,x,-5,5),
/**/point_type=6,points(cBI),point_type=7,points(cBE),
/**/color=green,explicit(0.75*cAnB,x,-5,5), /*"(▲修正時変更)" */
/**/point_type=6,points(cAnBI),point_type=7,points(cAnBE), /*"(▲修正時変更)" */
/**/color=red,explicit(F,x,-5,5),
/**/point_type=6,points(FI),point_type=7,points(FE),
/**/color=white,point_type=7,points([[xL,0]])
/**/) /* "◆数直線表示(赤の部分)◆" */;
print("A ",cAI,",",cAE," B",cBI,",",cBE," cAnB",cAnBI,",",cAnBE)
/* "◆上のグラフ(赤)とこの出力を見て、求める解を以下に書き込む◆(▲修正時変更)" */;
F:cR(x,1)+ceL(x,2);FI:[[1,1]];FE:[[2,1]] /* "(▲修正時変更)" */;
wxdraw2d(yrange=[-3,3],
/**/color=red,explicit(F,x,-5,5),point_type=6,points(FI),point_type=7,points(FE),
/**/color=white,point_type=7,points([[xL,0]])
) /* "◆数直線表示(赤の部分)◆" */;

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
cAc:1-cA;cAcI:cAE;cAcE:cAI /* "Acの数直線表示データ(◆修正部分)" */;
cBc:1-cB;cBcI:cBE;cBcE:cBcI
/* "AnBの数直線表示データ(◆修正部分)" */;
cAcnBc:cAc*cBc;cAcnBcI:append1(0,cAcnBc,cAcI,cBcI);cAcnBcE:append1(1,cAcnBc,cAcE,cBcE) /* "これがAcnBc(◆修正部分)" */;
cAcuBc:cAc+cBc-cAcnBc;cAcuBcI:append1(0,cAcuBc,cAcI,cBcI);cAcuBcE:append1(1,cAcuBc,cAcE,cBcE)
/* "これがAcuBc(◆修正部分)" */;
F:cAcuBc;FI:cAcuBcI;FE:cAcuBcE /* "これがAcuBc(修正後)で、(AnB)c(修正前)と一致することを確認(◆修正部分)" */;


:  10.命題と条件
   A 命題
▼コマンド番号1001
●練習62
命題の真偽●●●●●●●●●●●●●●●●
kill(all) /* "1001 命題の真偽" */$
(MONDAI:"1001 数n=-1は、命題P:n^2>=0を満たすか"/*(◆修正部分1)*/
)$
(SETTEI:"",
en:n=-1 /* "n(◆修正部分2)" */,
eP:n^2>=0 /* "P(◆修正部分2)" */)$
(SHORIorSHOUMEI:"",
print(en,"のとき、"),
print("Pの左辺"),
print(" =",subst(en,lhs(eP))),
print("右辺"),
print(" =",subst(en,rhs(eP))),
print("よって、左辺≧右辺")/*(◆修正部分3)*/
)$
(KAKUNIN:"",
if subst(en,eP) then ansl:[[en,eP,"満たす"],"答え"] else ansl:[[en,eP,"満たさない"],"答え"] /* "答え・確認" */,print(ansl)
)$
(KETURON:"",
print(MONDAI),print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
(MONDAI:"1001 数n=-3は、命題P:sqrt(n^2)=nを満たすか"/*(◆修正部分1)*/
en:n=-3 /* "n(◆修正部分2)" */,
eP:sqrt(n^2)=n /* "P(◆修正部分2)" */)$
print("よって、左辺≠右辺")/*(◆修正部分3)*/


   B 条件
   C 命題p⇒q
▼コマンド番号1002
●練習63-1
命題p⇒q●●●●●●●●●●●●●●●●
kill(all) /* "1002 命題p⇒q(Maxima on lineの場合、削除すること)" */$
MONDAI:"1002 条件p:x<=2,q:x<=4について、命題p==>qは真か(◆修正部分1)"$
(TEISUU:"",
xL:5
)$
(KANSUU:"",
append1(aI,f,fX,gX):=(print(aI,"/f",f,"/fX",fX,"/gX",gX),
/**/gX:append(fX,gX) /* "aIは0で開(1で閉)区間合成設定、fは区間合成関数、fX,gXは端点L" */,
/**/fX:[],
/**/for i:1 thru length(gX) do(
/*....*/xX:gX[i][1],gx:subst(x=xX,f),
/*....*/if (ev(gx,nouns,numer)=aI and xX#xL) or xX=xL then fX:endcons(gX[i],fX) /* "重複端点削除" */,
/*....*/print(i,"/aI",aI,"/f",f,"/gX",gX,"/xX",xX,"/gx",gx,"/xL",xL,"/fX",fX)),
/**/fX) /* "端点設定" */,
cL(x,a):= (cLL: [a<x ,[a,1],[xL,0]],if cLL[1] then 1 else 0) /* "[左開端点条件,開端点,閉端点([xL,0]ダミー)]、{a< x}の特性関数" */,
ceL(x,a):=(ceLL:[a<=x,[xL,0],[a,1]],if ceLL[1] then 1 else 0) /* "[左閉端点条件,開端点([xL,0]ダミー),閉端点]、{a<=x}の特性関数" */,
cR(x,a):= (cRL: [x<a ,[a,1],[xL,0]],if cRL[1] then 1 else 0) /* "[右開端点条件,開端点,閉端点([xL,0]ダミー)]、{x< a}の特性関数" */,
ceR(x,a):=(ceRL:[x<=a,[xL,0],[a,1]],if ceRL[1] then 1 else 0) /* "[右閉端点条件,開端点([xL,0]ダミー),閉端点]、{x<=a}の特性関数" */
)$
(SHORIandHYOUJI:"",
cP:ceR(x,2),cPI:[ceRL[2]],cPE:[ceRL[3]] /* "条件p:x<=2を満たす集合Pの数直線表示データ(◆修正部分2)" */,
cQ:ceR(x,4),cQI:[ceRL[2]],cQE:[ceRL[3]] /* "条件q:x<=4を満たす集合Qの数直線表示データ(◆修正部分2)" */,

wxdraw2d(yrange=[-3,3],explicit(0.5*cP,x,-xL,xL),
/**/point_type=6,points(cPI),point_type=7,points(cPE),
/**/color=green,explicit(cQ,x,-xL,xL), /**/point_type=6,points(cQI),point_type=7,points(cQE),
/**/color=white,point_type=7,points([[xL,0]])
/**/),print("p==>q(P(青)が Q(緑) の内(下)側)か")
)$
(SUIRON:"",
pr1:["条件pを満たす集合Pが条件qを満たすQに含まれる","(グラフより)"],print(pr1),
ansl:[p,"⇒",q,"答え"],print(ansl)
)$
(KETURON:"",
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"1002 条件p:x>=4,q:x>=2について、命題p==>qは真か(◆修正部分1)"$
cP:ceL(x,4),cPI:[ceLL[2]],cPE:[ceLL[3]] /* "条件p:x>=4を満たす集合Pの数直線表示データ(◆修正部分2)" */,
cQ:ceL(x,2),cQI:[ceLL[2]],cQE:[ceLL[3]] /* "条件q:>=2を満たす集合Qの数直線表示データ(◆修正部分2)" */,


▼コマンド番号1003
●練習63-2
命題p⇒q●●●●●●●●●●●●●●●●
kill(all) /* "1003 命題p⇒q" */$
MONDAI:"1003 条件p(mは12の正の約数),q(mは24の正の約数)について、p⇒qか(◆修正部分1)"$
(TEJUN:"",
P:{[m,"|",[m>0 ,mod(12,m)=0]] } /* "p(mは12の正の約数)の真理集合(◆修正部分2)" */,
Q:{[n,"|",[n>0 ,mod(24,n)=0]] } /* "q(mは24の正の約数)の真理集合" */,
d:"C",
for i: 1 thru 24 do
/**/if subst(m=i,first(P)[3][2]) then(
/*....*/print(i,"E","P"),
/*....*/if subst( n=i, first(Q)[3][2]) then print (" ",i,"E","Q","OK")
/*........*/else(d:"#C",print (" ",i,"#E","Q","ng"))),
print("P",d,"Q"),
if d="C" then ansl:[["p","==>","q"],"答え"] else ansl:[["p","#=>","q"],"答え"]/* "p⇒qの真偽確認" */
)$
(SUIRON:"",
print(["P",P,"pの真理集合"]),
print(["Q",Q,"qの真理集合"]),
print("任意のa∈Pについて、a∈Q (前段による)")/*(◆修正部分3)*/,
print(["P",d,"Q"]),
print("よって、"),
print(ansl)
)$
(KETURON:"",
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"1003 条件p(mは18の正の約数),q(mは24の正の約数)について、p⇒qか(◆修正部分1)"$
P:{[m,"|",[m>0 ,mod(18,m)=0]]} /* "p(mは18の正の約数)の真理集合(◆修正部分2)" */,
print("9∈Pについて、9#∈Q (前段による)")/*(◆修正部分3)*/,


▼コマンド番号1004
●例37
反例●●●●●●●●●●●●●●●●
kill(all) /* "1004 反例" */$
MONDAI:"1004 数a=1,b=-1により、条件p(a^2=b^2),q(a=b)について、p⇒qの真偽を判断できるか(◆修正部分1)"$
(SETTEI:"",
abL:[a=1,b=-1] /* "(◆修正部分2)" */,
p:a^2=b^2 /* "条件p(a^2=b^2)" */,
q:a=b /* "条件q(a=b)" */
)$
(TEJUN:"",
if subst(abL,p) and not subst(abL,q) then(
/*....*/print(abL,"=>",["p",subst(abL,p)],["q",subst(abL,q)]),
/*....*/print(abL,"はp=>qの反例となる"),
/*....*/ansl:[[p," ==> ",q],"偽",[abL,"反例となる"]]
/**/)else(
/*....*/print(abL,"=>",["p",subst(abL,p)],["q",subst(abL,q)]),
/*....*/print(abL,"はp=>qの反例とならず"),
/*....*/ansl:[[p," ==> ",q],"真偽判断はできない",[abL,"は反例とならず"]]
/*....*/) /* "反例かどうかの判断" */
)$
(SUIRON:"",
print(abL,"のとき"),
print(["p",p],subst(abL,p),if subst(abL,p)then "真" else "偽"),
print(" ",["q",q],subst(abL,q),if subst(abL,q)then "真" else "偽"),
print("よって、",abL,"は、p==>qの反例(◆修正部分3)")
)$
(KETURON:"",
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"1004 数a=-4,b=-4により、条件p(a^2=b^2),q(a=b)について、p⇒qの真偽を判断できるか(◆修正部分1)"$
abL:[a=-4,b=-4] /* "このa,bからp⇒qの真偽を判断できるか(◆修正部分2)" */,
print("よって、",abL,"は、p==>qの反例とならず(◆修正部分3)")


▼コマンド番号1005
●練習64
反例●●●●●●●●●●●●●●●●
kill(all) /* "1005 反例" */$
MONDAI:"1005 nが自然数のとき、条件p(nは奇数),q(nは素数)について、「p⇒q」の真偽は(◆修正部分1)" $
(TEJUN:"",
p:mod(n,2)=1 /* "条件p(自然数nは奇数)" */,
q:'primep(n) /* "条件q(自然数nは素数)" */,
U:{},P:{},Q:{},
for i:1 thru 10 do( /* "1~10のnについて(◆修正部分2)" */
/**/U:adjoin(i,U),
/**/if subst(n=i,p) then P:adjoin(i,P),
/**/qn:subst(n=i,q),
/**/if ev(qn,nouns,numer) then(
/*....*/Q:adjoin(i,Q),
/*....*/if mod(i,2)=1 then print(i,"素数 かつ 奇数")
/*....*/else print(i,"素数 かつ 偶数"))) /* "真偽集合を作って" */,
print("U",U,"全体集合"),
print("P",P,"pの真理集合"),
print("Q",Q,"qの真理集合"),
if subsetp(Q,P) then(
/*....*/print("P C Q "," 素数 ==> 奇数"),ansl:["p==>qは真","答え"])
/**/else(
/*....*/print("P #C Q "," 素数 #=> 奇数"),ansl:["p==>qは偽","答え"]) /* "◆真偽の判断◆◆" */
)$
(SUIRON:"",
print("2は素数であるが、奇数ではない(◆修正部分3)"),
print("2が反例となって(◆修正部分3)"),
print(ansl)
)$
(KETURON:"",
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"1005 nが10~19以上の自然数のとき、条件p(nは奇数),q(nは素数)について、「p⇒q」の真偽は(◆修正部分1)" $
for i:10 thru 19 do( /* "10~19のnについて(◆修正部分2)" */
print("P C Q となって(◆修正部分3)"),

   D 必要条件・十分条件
▼コマンド番号1006
●例38
必要条件・十分条件●●●●●●●●●●●●●●●●
kill(all) /* "1006 必要条件・十分条件" */$
MONDAI:"1006 条件p(a=3),q(a^2=9)について、pはqの、qはpの何条件か(◆修正部分1)" $
(TEJUN:"",
p:a=3 /* "条件p(a=3)(◆修正部分2)" */,
q:a^2=9 /* "条件q(a^2=9)(◆修正部分2)" */,
P:{[a,"|",[p]]} /* "条件pの真理集合" */,
Q:{[a,"|",[q]]} /* "条件qの真理集合" */,
s1L:solve(first(P)[3][1],a),
s2L:solve(first(Q)[3][1],a),
print("P",s1L),
print("Q",s2L)
/* "◆2つの結果から次の2つの真理集合を要素で置き換え◆" */
)$
(TEJUN2:"",
P:{3} ,print("P",P)/* "(◆修正部分3)" */,
Q:{-3,3} ,print("Q",Q)/* "(◆修正部分3)" */,
if subsetp(P,Q) then
/**/print("p(",p,") ==> q(",q,") pはqの十分条件、qはpの必要条件")
/**/else
/*....*/print("p(",p,") #=> q(",q,") pはqの十分条件でない、qはpの必要条件でない"),
if subsetp(Q,P) then
/*....*/print("q(",q,") ==> p(",p,") qはpの十分条件、pはqの必要条件")
/**/else
/*....*/print("q(",q,") #=> p(",p,") qはpの十分条件でない、pはqの必要条件でない")
/* "2つの結果から必要条件か十分条件かの判断" */
)$
(SUIRON:"",
print("P C Qだから"),
ansl:["pはqの十分条件、qはpの必要条件","答え"],print(ansl)
)$
(KETURON:"",
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"1006 条件p(a=-4),q(a^2=16)について、pはqの、qはpの何条件か(◆修正部分1)" $
p:a=-4 /* "条件p(a=3)(◆修正部分2)" */,
q:a^2=16 /* "条件q(a^2=9)(◆修正部分2)" */,
P:{-4} ,print("P",P)/* "(◆修正部分3)" */,
Q:{-4,4} ,print("Q",Q)/* "(◆修正部分3)" */,


▼コマンド番号1007
●練習65
必要条件・十分条件●●●●●●●●●●●●●●●●
kill(all) /* "1007 必要条件・十分条件(Maxima on lineでは削除)" */$
MONDAI:"練習65 1007 条件p(0< x),q(0<= x)について、「p⇒q」の真偽は(◆修正部分1)" $
(TEISUU:"",
xL:5
)$
(KANSUU:"",
append1(aI,f,fX,gX):=(/*print(aI,"/f",f,"/fX",fX,"/gX",gX),*/
/**/gX:append(fX,gX) /* "aIは0で開(1で閉)区間合成設定、fは区間合成関数、fX,gXは端点L" */,
/**/fX:[],
/**/for i:1 thru length(gX) do(
/*....*/xX:gX[i][1],gx:subst(x=xX,f),
/*....*/if (ev(gx,nouns,numer)=aI and xX#xL) or xX=xL then fX:endcons(gX[i],fX) /* "重複端点削除" */
/*....print(i,"/aI",aI,"/f",f,"/gX",gX,"/xX",xX,"/gx",gx,"/xL",xL,"/fX",fX)*/),
/**/fX) /* "端点設定" */,
cL(x,a):= (cLL: [a<x ,[a,1],[xL,0]],if cLL[1] then 1 else 0) /* "[左開端点条件,開端点,閉端点([xL,0]ダミー)]、{a<x}の特性関数" */,
ceL(x,a):=(ceLL:[a<=x,[xL,0],[a,1]],if ceLL[1] then 1 else 0) /* "[左閉端点条件,開端点([xL,0]ダミー),閉端点]、{a<=x}の特性関数" */,
cR(x,a):= (cRL: [x<a ,[a,1],[xL,0]],if cRL[1] then 1 else 0) /* "[右開端点条件,開端点,閉端点([xL,0]ダミー)]、{x<a}の特性関数" */,
ceR(x,a):=(ceRL:[x<=a,[xL,0],[a,1]],if ceRL[1] then 1 else 0) /* "[右閉端点条件,開端点([xL,0]ダミー),閉端点]、{x<=a}の特性関数" */
)$
(TEJUN:"",
cP:cL(x,0),cPI:[cLL[2]],cPE:[cLL[3]] /* "p:0< xの数直線表示データ(◆修正部分2)" */,
cQ:ceL(x,0),cQI:[ceLL[2]],cQE:[ceLL[3]] /* "q:0<=xの数直線表示データ(◆修正部分2)" */,
F:cQ-cP,FI:append1(0,F,cQI,cPE),FE:append1(1,F,cQE,cPI) /* "q>=pの数直線表示データ(◆修正部分2)" */,
wxdraw2d(yrange=[-3,3],explicit(0.3*cP,x,-5,5),
/**/point_type=6,points(cPI),point_type=7,points(cPE),
/**/color=green,explicit(0.6*cQ,x,-5,5),
/**/point_type=6,points(cQI),point_type=7,points(cQE),
/**/color=red,explicit(F,x,-5,5),point_size=2,
/**/point_type=6,points(FI),point_type=7,points(FE),
/**/color=white,point_type=7,points([[xL,0]])
/**/) /* "◆P(青pの真理集合)が Q(緑qの真理集合) の内(下)側か(赤が上側(y>=0)のみか)により判断◆" */
)$
(TEJUN2:"",
PCQ:["P",cP,"C","Q",cQ] /* "グラフを見て、P(青)を Q(緑)が含む"C"、逆"D"、どちらでもない"#"に書換(◆修正部分3)" */,print(PCQ),
if PCQ[3]="C" then ansl:["pはqの十分条件","答え"] /* "◆必要条件・十分条件の判断◆" */,
if PCQ[3]="D" then ansl:["pはqの必要条件","答え"] /* "◆必要条件・十分条件の判断◆" */,
if PCQ[3]="#" then ansl:["pはqの必要条件でも十分条件でもない","答え"] /* "◆必要条件・十分条件の判断◆" */,print(ansl)
)$
(SUIRON:"",
print(PCQ,"だから"),
print(ansl)
)$
(KETURON:"",
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"練習65 1007 条件p(3<=x),q(-2< x < 4)について、「p⇒q」の真偽は(◆修正部分1)" $
cP:ceL(x,3),cPI:[ceLL[2]],cPE:[ceLL[3]] /* "p:x>=3の数直線表示データ●pはqの何条件か●(◆修正部分2)" */,
cA:cL(x,-2),cAI:[cLL[2]],cAE:[cLL[3]] /* "q:x>-2の数直線表示データ(◆修正部分2)" */,
cB:cR(x,4),cBI:[cLL[2]],cBE:[cLL[3]] /* "q:x< 4の数直線表示データ(◆修正部分2)" */,
cQ:cA*cB,cQI:append1(0,cQ,cAI,cBI),cQE:append1(1,cQ,cAE,cBE) /* "q:-2< x < 4の数直線表示データ(◆修正部分2)" */,
F:cQ-cP,FI:append1(0,F,cQI,cPE),FE:append1(1,F,cAE,cPI) /* "p<=qの数直線表示データ(◆修正部分2)" */,
PCQ:["P",cP,"#","Q",cQ] /* "グラフを見て、P(青)を Q(緑)が含む"C"、逆"D"、どちらでもない"#"に書換(◆修正部分3)" */,print(PCQ),


▼コマンド番号1008
●練習65-2
必要条件・十分条件●●●●●●●●●●●●●●●●
kill(all) /* "1008 必要条件・十分条件(Maxima on lineでは削除)" */$
MONDAI:"●練習65-2 1008 条件p((a-b)*b=0),q(a=b)について、pはqの何条件か(◆修正部分1)"$
(TEJUN:"",
p:[(a-b)*a=0] /* "条件p((a-b)*b=0)(◆修正部分2)" */,
q:[a =b] /* "条件q(a=b)" */,
P:{[a,"|",p]} /* "pの真理集合" */,
Q:{[a,"|",q]} /* "qの真理集合" */,
aL:solve(first(P)[3][1],a),
P:{[a,"|",aL]},
print("P",P),print("Q",Q) /* "この2つから、以下2つを書換" */
)$
(TEJUN2:"",
P:{0,b} /* "上の結果からから書換(◆修正部分3)" */,
Q:{b} /* "上の結果からから" */,
print(["P",P]),print(["Q",Q]),
print(["P #C Q","Q C P"]),
sPCQ:subsetp(P,Q) /* "P C Qならばtrue" */,
sQCP:subsetp(Q,P) /* "Q C Pならばtrue" */,
if sPCQ then(
/**/pr1l:[["p",p,"==>q",q]],
/**/if sQCP then pr1l:endcons(["q",q,"==>p",p," pはqの必要十分条件"],pr1l)
/*....*/else pr1l:endcons(["q",q,"#=>p",p," pはqの十分条件"],pr1l))
/**/else(
/*....*/pr1l:[["p",p,"#=>q",q]],
/*....*/if sQCP then pr1l:endcons(["q",q,"==>p",p," pはqの必要条件"],pr1l)
/*......*/else pr1l:endcons(["q",q,"#=>p",p," pはqの必要条件でも十分条件でもない"],pr1l)
/* "pがqの必要条件か十分条件かの判断" */),print(pr1l),
ansl:[pr1l[2][5],"答え"] )$
(KETURON:"",
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"●練習65-2 1008 条件p(a^2-b^2=0),q(a=b)について、pはqの何条件か(◆修正部分1)"$
p:[a^2-b^2=0] /* "条件p:a^2-b^2=0(◆修正部分2)" */,
P:{b,-b} /* "上の結果からから書換(◆修正部分3)" */,


▼コマンド番号1009
●例39
同値・必要十分条件●●●●●●●●●●●●●●●●
kill(all) /* "1009 同値・必要十分条件(Maxima on lineでは削除)" */$
MONDAI:"●例39 1009 条件p(a^2=0),q(a =0)について、pはqの必要十分条件か(◆修正部分1)"$
(TEJUN:"",
p:[a^2=0] /* "条件p(◆修正部分2)" */,
q:[a =0] /* "条件q(◆修正部分2)" */,
P:{[a,"|",p]} /* "pの真理集合" */,
Q:{[a,"|",q]} /* "qの真理集合" */,
aL:solve(first(P)[3][1],a),
P:{[a,"|",aL]},print("P",P),
print("Q",Q) /* "この2つから、以下2つを書換" */
)$
(SUIRON:"",
P:{0} /* "上の結果からから書換(◆修正部分3)" */,
Q:{0} /* "上の結果からから(◆修正部分3)" */,
print("P",P),print("Q",Q),print("P C Q","かつ","Q C P"),
print("よって、"),print("P=Q"),
sPCQ:subsetp(P,Q) /* "P C Qならばtrue" */,
sQCP:subsetp(Q,P) /* "Q C Pならばtrue" */,
if sPCQ then(
/*....*/prl:[["p",p,"==> q",q]],
/*....*/if sQCP then(prl:endcons(["q",q,"==> p",p],prl),prl:endcons(["pはqの必要十分条件"],prl))
/*........*/else(prl:endcons(["q",q,"#=> p",p],prl),prl:endcons(["pはqの十分条件"],prl)))
/**/else(
/*....*/prl:[["p",p,"#=> q",q]],
/*....*/if sQCP then(prl:endcons(["q",q,"==> p",p],prl),prl:endcons(["pはqの必要条件"],prl))
/*........*/else(prl:endcons(["q",q,"#=> p",p],prl),prl:endcons(["pはqの必要条件でも十分条件でもない"],prl))),
/**/print(prl)/* "◆◆pがqの必要条件か十分条件かの判断◆◆" */
)$
(KETURON:"",
ansl:[prl[3],"答え"],
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"●例39 1009 条件p((a-b)^2=0),q(a =b)について、pはqの必要十分条件か(◆修正部分1)"$
p:[(a-b)^2=0] /* "条件p(◆修正部分2)" */,
q:[a =b] /* "条件q(◆修正部分2)" */,
P:{b} /* "上の結果からから書換(◆修正部分3)" */,
Q:{b} /* "上の結果からから(◆修正部分3)" */,


▼コマンド番号1010
●練習66
同値な条件●●●●●●●●●●●●●●●●
kill(all) /* "1010 同値な条件(Maxima on lineでは削除)" */$
MONDAI:"●練習66 1010 条件p(a=b),q(a +c=b +c)について、pはqの必要十分条件か(◆修正部分1)"$
(TEJUN:"",
p:[a=b] /* "条件p" */,
q:[a +c=b +c] /* "条件q(◆修正部分2)" */,
P:{[a,"|",p]} /* "pの真理集合" */,
Q:{[a,"|",q]} /* "qの真理集合" */,
aL:solve(first(Q)[3][1],a),
P:{[a,"|",[a =b]]},print("P",P),
Q:{[a,"|",aL]},print("Q",Q) /* "◆◆この2つから、以下2つを書換◆◆(▲修正時変更)" */
)$
(SUIRON:"",
P:{b},print("P",P),
Q:{b},print("Q",Q)/*(◆修正部分3)*/,
print("P C Q"," Q C P"),print("よって"),print("P = Q")/*(◆修正部分3)*/,
sPCQ:subsetp(P,Q) /* "P C Qならばtrue" */,
sQCP:subsetp(Q,P) /* "Q C Pならばtrue" */,
if sPCQ then(
/*....*/prl:[["p",p,"==> q",q]],
/*....*/if sQCP then(prl:endcons(["q",q,"==> p",p],prl),prl:endcons(["pはqの必要十分条件"],prl))
/*........*/else(prl:endcons(["q",q,"#=> p",p],prl),prl:endcons(["pはqの十分条件"],prl)))
/**/else(
/*....*/prl:[["p",p,"#=> q",q]],
/*....*/if sQCP then(prl:endcons(["q",q,"==> p",p],prl),prl:endcons(["pはqの必要条件"],prl))
/*........*/else(prl:endcons(["q",q,"#=> p",p],prl),prl:endcons(["pはqの必要条件でも十分条件でもない"],prl))),
/**/print(prl)/* "◆◆pがqの必要条件か十分条件かの判断◆◆" */
)$
(KETURON:"",
ansl:[prl[3],"答え"],
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。

MONDAI:"●練習66 1010 条件p(a=b),q(a^2=b^2)について、pはqの必要十分条件か(◆修正部分1)"$
q:[a^2=b^2] /* "条件q(◆修正部分2)" */,
Q:{-b,b},print("Q",Q)/*(◆修正部分3)*/,
print("P C Q"," Q #C P"),print("よって"),print("P C Q")/*(◆修正部分3)*/,


◎◎条件を決定する式が、等式の性質、不等式の性質により、同一の式に変形できるような条件は、同値である。

   E 条件の否定
▼コマンド番号1011
●例40-1
実数に関する条件の否定●●●●●●●●●●●●●●●●
kill(all) /* "1011 実数に関する条件の否定(Maxima on lineでは削除)" */$
(MONDAI:"●例40-1 1011 条件p(x:有理数)について、pの否定は(◆修正部分)" )$
(TEJUN:"",
Netc:"他正整数",Nmetc:"他負整数",Zetc:"他整数",Dpetc1:"他正有限小数1",Dpetc2:"他正有限小数2",Dmetc1:"他負有限小数1",Dmetc2:"他負有限小数2", Detc1:"他有限小数1",Detc2:"他有限小数2",
N:{1,2,3,4,Netc} /* "N:{}; for i:1 thru 4 do N:adjoin(i,N); で実現(自然数・正の整数)" */,
Nm:{-1,-2,-3,-4,Nmetc} /* "Nm:{}; for i:-1 step -1 thru -4 do Nm:adjoin(i,Nm); で実現(負の整数)" */,
Z:{0,1,-1,2,-2,3,-3,4,-4,Zetc} /* union({0},union(N,Nm)); で実現(整数) */,
Dp:{0.001,0.002,0.003,0.004,Dpetc1,4.000,Dpetc2}
/* " Qp:{};for i:0 thru 3 do( for j:1 thru 1000 do Qp:adjoin(i+j/1000,Qp)); で実現(正の有限小数,NCDpと見なす)" */,
Dm:{-0.001,-0.002,-0.003,-0.004,Dmetc1,-4.000,Dmetc2}
/* " Qp:{};for i:0 step -1thru 3 do( for j:1 thru 1000 do Qp:adjoin(i+j/1000,Qp)); で実現(負の有限小数,NmCDmと見なす)" */,
D:{0,0.001,-0.001,Detc1,3.999,-3.999,4,-4,Detc2} /* union({0},Dp,Dm); で実現(有限小数、整数の比の値で有限なもの,ZCDと見なす) */,
J:{"循環小数"} /* "整数と正の整数との比の値で実現" */,
Q:union(D,J) /* "有理数、2つの整数の比の値で実現(有理数)" */,
I:{"無理数(循環しない無限小数)"} /* "無理数(有理数で近似できるが、有理数(2つの整数の比の値)でない。r(2)など)" */,
R:union(Q,I) /* "数直線上に実現できる。(実数:有理数(有限小数と無限小数で循環するもの)と循環しない無限小数)" */
)$
(SUIRON:"",
p:[x,"E",Q] /* "条件p(xEQ)(◆修正部分)" */,
Qc:setdifference(R,Q) /* "集合Rから集合Qを除いた集合◆RでのQの補集合◆(◆修正部分)" */,
pc:[x,"E",Qc],ansl:[pc,"結論"],
print("R",R,"実数(全体集合)"),print("Q",Q,"有理数の集合"),print("Qc",Qc,"無理数の集合"),print("pc",pc,"x:無理数")
)$ (KETURON:"",
print(MONDAI),
print(ansl)
)$,

◎条件を否定したものは、全体集合から条件を満たすものを除いたものになる。
◎条件の否定は、全体集合から条件を満たすものを除いたものの条件になる。
◎上のMaximaコマンドを実行せよ。
◎上の結果から、条件「有理数である」の否定を考察せよ。


▼コマンド番号1012
●例40-2
実数に関する条件の否定●●●●●●●●●●●●●●●●
kill(all) /* "1012 実数に関する条件の否定(Maxima on lineでは削除)" */$
MONDAI:"1012 条件p(0< x)について、pの否定は(◆修正部分1)"$
(TEISUU:"",
xL:5
)$
(KANSUU:"",
append1(aI,f,fX,gX):=(/*print(aI,"/f",f,"/fX",fX,"/gX",gX),*/
/**/gX:append(fX,gX) /* "aIは0で開(1で閉)区間合成設定、fは区間合成関数、fX,gXは端点L" */,
/**/fX:[],
/**/for i:1 thru length(gX) do(
/*....*/xX:gX[i][1],gx:subst(x=xX,f),
/*....*/if (ev(gx,nouns,numer)=aI and xX#xL) or xX=xL then fX:endcons(gX[i],fX) /* "重複端点削除" */
/*....print(i,"/aI",aI,"/f",f,"/gX",gX,"/xX",xX,"/gx",gx,"/xL",xL,"/fX",fX)*/),
/**/fX) /* "端点設定" */,
cL(x,a):= (cLL: [a< x ,[a,1],[xL,0]],if cLL[1] then 1 else 0) /* "[左開端点条件,開端点,閉端点([xL,0]ダミー)]、{a< x}の特性関数" */,
ceL(x,a):=(ceLL:[a<=x,[xL,0],[a,1]],if ceLL[1] then 1 else 0) /* "[左閉端点条件,開端点([xL,0]ダミー),閉端点]、{a<=x}の特性関数" */,
cR(x,a):= (cRL: [x< a ,[a,1],[xL,0]],if cRL[1] then 1 else 0) /* "[右開端点条件,開端点,閉端点([xL,0]ダミー)]、{x< a}の特性関数" */,
ceR(x,a):=(ceRL:[x<=a,[xL,0],[a,1]],if ceRL[1] then 1 else 0) /* "[右閉端点条件,開端点([xL,0]ダミー),閉端点]、{x<=a}の特性関数" */
)$
(TEJUN:"",
cP:cL(x,0),cPI:[cLL[2]],cPE:[cLL[3]] /* "p:0< xの数直線表示データ(◆修正部分2)" */,
F:1-cP,FI:cPE,FE:cPI,
/*print(FI," ",FE),*/
wxdraw2d(yrange=[-3,3],explicit(0.5*cP,x,-5,5),
/**/point_type=6,points(cPI),point_type=7,points(cPE),
/**/color=red,explicit(F,x,-5,5),
/**/point_type=6,points(FI),point_type=7,points(FE),
/**/color=white,point_type=7,points([[5,0]]))
/**/ /* "◆pの否定の真理集合(赤)を確認◆" */
)$
(TEJUN2:"",
F:ceR(x,0),FI:[ceRL[2]],FE:[ceRL[3]] /* "◆グラフを見て、pの否定の特性関数に書換◆(◆修正部分3)" */,
wxdraw2d(yrange=[-3,3],
/**/color=red,explicit(F,x,-5,5),point_size=2,
/**/point_type=6,points(FI),point_type=7,points(FE),
/**/color=white,point_type=7,points([[5,0]]))
/**//* "◆グラフが上の赤と同じか確認◆" */ )$
(SUIRON:"",
print(["p",0< x])/*(◆修正部分4)*/,
print("P",[x,"|",cP]),
print("Pc",[x,"|",F]),
ansl:[["pc",x<= 0],"結論"],print(ansl[1])/*(◆修正部分5)*/
)$
(KETURON:"",
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"1012 条件p(x<=2)について、pの否定は(◆修正部分1)"$
cP:ceR(x,2),cPI:[ceRL[2]],cPE:[ceRL[3]] /* "p:x<=2の数直線表示データ●pの否定は●(◆修正部分2)" */,
F:cL(x,2),FI:[cLL[2]],FE:[cLL[3]] /* "◆グラフを見て、pの否定の特性関数に書換◆(◆修正部分3)" */,
print(["p",x<=2])/*(◆修正部分4)*/,
ansl:[["pc",2< x],"結論"],print(ansl[1])/*(◆修正部分5)*/


▼コマンド番号1013
●練習67
自然数に関する条件の否定●●●●●●●●●●●●●●●●
kill(all) /* "1013 自然数に関する条件の否定(Maxima on lineでは削除)" */$
MONDAI:"●練習67 1013 自然数nの条件p(n:偶数)について、pの否定は(◆修正部分1)"$
(TEISUU,
iM:8
)$
(TEJUN:"",
p:mod(n,2)=0 /* "条件p:nは偶数 ●(◆修正部分2)" */,
{2,4,6,8,"etc"} /* "自然数で偶数の集合" */,
P:{},Pc:{},
for i:1 thru iM do(
/**/if subst(n=i,p) then P:adjoin(i,P) else Pc:adjoin(i,Pc)),
P:adjoin("etc",P),print("P",P) /* "◆条件pを満たす集合が無限の場合は追加。(有限の場合、不要)(◆修正部分3)◆" */,
Pc:adjoin("etc",Pc),print("Pc",Pc) /* "◆条件pを満たさない集合が無限の場合は追加。(有限の場合、不要)(◆修正部分3)◆" */
)$
(KAKUNIN:"",
pc:mod(n,2)=1 /* "条件pの否定をここに書き込む(◆修正部分4)" */,
Pc0:{},
for i:1 thru iM do(
/**/if subst(n=i,pc) then Pc0:adjoin(i,Pc0)),
Pc0:adjoin("etc",Pc0),
print("Pc",Pc),print("Pc0",Pc0) /* "◆上のPcと一致しているか◆" */
)$
(SUIRON:"",
print("p",p),
print("pc",pc),
ansl:["pc","n:奇数","答え"],print(ansl)/*(◆修正部分5)*/
)$
(KETURON:"",
print(MONDAI),print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"●練習67 1013 自然数nの条件p(n:5未満の自然数)について、pの否定は(◆修正部分1)"$
p:n< 5 /* "条件p:n < 5 (◆修正部分2)" */,
print("P",P) /* "◆条件pを満たす集合が無限の場合は追加。(有限の場合、不要)(◆修正部分3)◆" */,
Pc:adjoin("etc",Pc),print("Pc",Pc) /* "◆条件pを満たさない集合が無限の場合は追加。(有限の場合、不要)(◆修正部分3)◆" */
pc:n>= 5 /* "条件pの否定をここに書き込む(◆修正部分4)" */,
ansl:["pc","n:5以上の自然数","答え"],print(ansl)/*(◆修正部分5)*/


   E 「かつ」「または」と否定
▼コマンド番号1014
●例41
「かつ」「または」と否定●●●●●●●●●●●●●●●●
kill(all) /* "1014 「かつ」「または」と否定(Maxima on lineでは削除)" */$
MONDAI:"●例41 1014 a,bを実数として、(a,b)の条件p:[a=0 and b=0]について、pの否定は(◆修正部分1)" $
(TEISUU:"",
xL:5,aL:xL-0.1,bL:aL
)$
(TEJUN1:"",
P1:{[[0,b],"|",[a=0,bER]]} /* "p1:a=0,bERの真理集合平面表示データ(◆修正部分2)" */,
P2:{[[a,0],"|",[b=0,aER]]} /* "p2:b=0,aERの真理集合平面表示データ(◆修正部分2)" */,
pP1:[],pP2:[] ,
for k:-50 thru 50 do(for i:-5 thru 5 do(
/**/pk:subst(a=k/10,first(P1)[3][1]),
/**/if ev(pk,nous,numer) then pP1:endcons(subst([a=k/10,b=i],[a,b]),pP1)))
/**//* "P1の点表示データ" */,
for k:-50 thru 50 do(for i:-5 thru 5 do(
/**/pk:subst(b=k/10,first(P2)[3][1]),
/**/if ev(pk,nous,numer) then pP2:endcons(subst([a=i,b=k/10],[a,b]),pP2)))
/**//* "P2の点表示データ" */,
pP:listify(intersect(setify(pP1),setify(pP2))) /* "真理集合P=(P1)n(P2))の領域は" */,
draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/background_color = white,
/**/points_joined = true,
/**/line_width =1 /* "" */,
/**/point_size =0,color =royalblue,
/**/point_type =7,points(pP1) ,
/**/color =red,
/**/point_type =7,points(pP2) ,
/**/points_joined = false /* "()" */,
/**/color =dark_violet,
/**/point_size =2 /* "()" */,
/**/point_type =7,points(pP)
/**/) /* "(P1(青)、P2(赤)、)真理集合P(紫)からP=P1nP2を確認(横軸がa、縦軸がb)" */
)$
(TEJUN2:"",
pP1c:[],pP2c:[],
for k:-50 thru 50 do(for i:-5 thru 5 do(
/**/pk:subst(a=k/10,first(P1)[3][1]),
/**/if not ev(pk,nous,numer) then pP1c:endcons(subst([a=k/10,b=i],[a,b]),pP1c))),
for k:-50 thru 50 do(for i:-5 thru 5 do(
/**/pk:subst(b=k/10,first(P2)[3][1]),
/**/if not ev(pk,nous,numer) then pP2c:endcons(subst([a=i,b=k/10],[a,b]),pP2c))),
pPc:append(pP1c,pP2c) /* "真理集合Pc=(P1c)u(P2c))の領域" */,
draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/points_joined = true,
/**/line_type = dots,color =royalblue,
/**/point_size =0,
/**/point_type =7,points(pP1c) ,
/**/color =red,
/**/point_type =7,points(pP2c) ,
/**/points_joined = false /* "()" */,
/**/color =dark_violet,
/**/point_size =2,
/**/point_type =7,points(pPc),
/**/points_joined = false /* "()" */,
/**/color =white,
/**/point_size =2 /* "()" */,
/**/point_type =7,points(pP)
/**/) /* "◆(P1c(赤)、P2c(青)、)真理集合Pc(紫)からPc=(P1c)u(P2c)を確認" */
)$
(SUIRON:"",
print("p((a=0 and b=0)c)") /* "(◆修正部分3)" */,
print(" = p(a=0)c or p(b=0)c") /* "(◆修正部分3)" */,
print(" = p(a#0 or b#0)") /* "(◆修正部分3)" */,
ansl:[["pc:","a#0 or b#0"],"答え"]/* "(◆修正部分3)" */
)$
(KETURON:"",
print(MONDAI),print(ansl)
)$

◎実数a,bを対等に扱うので、座標平面上の点として扱っている。
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"●例41 1014 a,bを実数として、(a,b)の条件p:[a>0 or b>0]について、pの否定は(◆修正部分1)" $
P1:{[[a,b],"|",[a>0,bER]]} /* "p1:a>0,bERの真理集合平面表示データ(◆修正部分2)" */,
P2:{[[a,b],"|",[b>0,aER]]} /* "p2:b>0,aERの真理集合平面表示データ(◆修正部分2)" */,
print("p((a>0 or b>0)c)") /* "(◆修正部分3)" */,
print(" = p(a>0)c and p(b>0)c") /* "(◆修正部分3)" */,
print(" = p(a<=0 and b<=0)") /* "(◆修正部分3)" */,
ansl:[["pc:","a<=0 and b<=0"],"答え"]/* "(◆修正部分3)" */


▼コマンド番号1015
●練習68
「かつ」「または」と否定●●●●●●●●●●●●●●●●
kill(all) /* "1015 「かつ」「または」と否定(Maxima on lineでは削除)" */$
MONDAI:"●練習68 1015 実数a,bとして、(a,b)の条件p(a>0 かつ b>0)について、pの否定は(◆修正部分1)"$
(TEISUU:"",
xL:5,aL:xL-0.1,bL:aL
)$
(TEJUN1:"",
P1:{[[a,b],"|",[a>0,bER]]} /* "p1:a>0,bERの真理集合平面表示データ" */,
P2:{[[a,b],"|",[b>0,aER]]} /* "p2:b>0,aERの真理集合平面表示データ" */,
pP1:[],pP2:[],
for k:-50 thru 50 do(for i:-5 thru 5 do(
/**/pk:subst(a=k/10,first(P1)[3][1]),
/**/if ev(pk,nous,numer) then pP1:endcons(subst([a=k/10,b=i],[a,b]),pP1)
/**/))
/**//* "P1の点表示データ" */,
for k:-50 thru 50 do(for i:-5 thru 5 do(
/**/pk:subst(b=k/10,first(P2)[3][1]),
/**/if ev(pk,nous,numer) then pP2:endcons(subst([a=i,b=k/10],[a,b]),pP2)
/**/))
/**//* "P2の点表示データ" */,
pP:listify(intersect(setify(pP1),setify(pP2))) /* "条件pの真理集合(◆修正部分2)" */,
draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/background_color = white,
/**/points_joined = true, line_width =1,point_size =0,
/**/color=royalblue,point_type =7,points(pP1) ,
/**/color=red, point_type =7,points(pP2) ,
/**/points_joined = false,color =dark_violet,
/**/point_size =2, point_type =7,points(pP)
/**/) /* "(P1(青)、P2(赤)、)P(紫)からP=P1nP2を確認(横軸がa、縦軸がb)(◆修正部分3)" */,
print("p(a>0 and b>0) == (p(a>0) and p(b>0))") /* "(◆修正部分3)" */
)$
(TEJUN2:"",
pP1c:[],pP2c:[],
for k:-50 thru 50 do(for i:-5 thru 5 do(
/**/pk:subst(a=k/10,first(P1)[3][1]),
/**/if not ev(pk,nous,numer) then pP1c:endcons(subst([a=k/10,b=i],[a,b]),pP1c))
/**/),
for k:-50 thru 50 do(for i:-5 thru 5 do(
/**/pk:subst(b=k/10,first(P2)[3][1]),
/**/if not ev(pk,nous,numer) then pP2c:endcons(subst([a=i,b=k/10],[a,b]),pP2c))
/**/),
pPc:append(pP1c,pP2c) /* "条件p:[a>0 and b>0](真理集合P=(P1)n(P2))の否定は(◆修正部分4)" */,
draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/points_joined = true,line_type = dots,
/**/color =royalblue,point_size =0,
/**/point_type =7,points(pP1c) ,
/**/color =red,
/**/point_type =7,points(pP2c) ,
/**/points_joined = false,
/**/color =dark_violet,point_size =1,
/**/point_type =7,points(pPc),
/**/points_joined = false,
/**/color =white,point_size =2,
/**/point_type =7,points(pP)
/**/) /* "◆(P1c(赤)、P2c(青)、)Pc(紫)からPc=(P1c)u(P2c)を確認(◆修正部分5)" */,
print("(p(a>0 and b>0))c == (p(a>0)c or p(b>0)c) == p(a<=0 or b<=0)") /* "(◆修正部分5)" */
)$
(SUIRON:"",
print("(p(a>0 and b>0))c") /* "(◆修正部分6)" */,
print(" = (p(a>0)c or p(b>0)c)") /* "(◆修正部分6)" */,
print(" = p(a<=0) or p(b<=0)") /* "(◆修正部分6)" */,
print(" = p(a<=0 or b<=0)") /* "(◆修正部分6)" */,
ansl:[["pc:","a<=0 or b<=0"],"答え"]/* "(◆修正部分6)" */
)$
(KETURON:"",
print(MONDAI),print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"●練習68 1015 実数a,bとして、(a,b)の条件p(a>0 または b>0)について、pの否定は(◆修正部分1)"$
pP:listify(union(setify(pP1),setify(pP2))) /* "条件pの真理集合(◆修正部分2)" */,
/**/) /* "(P1(青)、P2(赤)、)P(紫)からP=P1uP2を確認(横軸がa、縦軸がb)(◆修正部分3)" */,
print("p(a>0 or b>0) == (p(a>0) or p(b>0))") /* "(◆修正部分3)" */
pPc:listify(union(setify(pP1c),setify(pP2c))) /* "条件pの真理集合P=(P1)u(P2))の否定(◆修正部分4)" */,
/**/) /* "◆(P1c(赤)、P2c(青)、)Pc(紫)からPc=(P1c)n(P2c)を確認(◆修正部分5)" */,
print("(p(a>0 or b>0))c == (p(a>0))c and (p(b>0))c == p(a<=0 and b<=0)") /* "(◆修正部分5)" */
print("(p(a>0 or b>0))c") /* "(◆修正部分6)" */,
print(" = (p(a>0))c and (p(b>0))c") /* "(◆修正部分6)" */,
print(" = p(a<=0) and p(b<=0)") /* "(◆修正部分6)" */,
print(" = p(a<=0 and b<=0)") /* "(◆修正部分6)" */,
ansl:[["pc:","a<=0 and b<=0"],"答え"]/* "(◆修正部分6)" */


▼コマンド番号1016
●例42
「かつ」「または」と否定●●●●●●●●●●●●●●●●
kill(all) /* "1016 「かつ」「または」と否定(Maxima on lineでは削除)" */$
MONDAI:"1016 下の条件pについて、pの否定は" ;
xL:5;aL:xL-0.1;bL:aL;
P1:{[[a,b],"|",[mod(a,2)=1,bEZ]]} /* "p1:a>0,bERの真理集合平面表示データ" */;
P2:{[[a,b],"|",[mod(b,2)=1,aEZ]]} /* "p2:b>0,aERの真理集合平面表示データ" */;
pP1:[];pP2:[] ;
for k:-5 step 2 thru 5 do(for i:-5 thru 5 do pP1:endcons(subst([a=k,b=i],[a,b]),pP1))
/**//* "Poyの点表示データ" */;
for k:-5 step 2 thru 5 do(for i:-5 thru 5 do pP2:endcons(subst([a=i,b=k],[a,b]),pP2))
/**//* "Pxoの点表示データ" */;
pP:append(pP1,pP2) /* "◆◆◆条件p:[mod(a,2)=1 or mod(b,2)=1](真理集合P=(P1)u(P2))の否定は(◆修正部分1)" */;
draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/background_color = white,
/**/points_joined = false,
/**/line_width =1 /* "" */,
/**/color =royalblue,
/**/point_size =3,point_type =7,points(pP1) ,
/**/color =red,
/**/point_size =2,point_type =7,points(pP2) ,
/**/points_joined = false /* "()" */,
/**/color =cyan,
/**/point_size =1,point_type =7,points(pP)
/**/) /* "◆(P1(青)、P2(赤)、)P(シアン)からP=P1uP2を確認し、下に書き込む(横軸がa、縦軸がb)◆(◆修正時変更)" */;
print("p(mod(a,2)=1 or mod(b,2)=1) == (p(mod(a,2=1) or p(mod(a,2)=1))") /* "(◆修正時変更)" */;
pP1c:[];pP2c:[];
for k:-4 step 2 thru 5 do(for i:-5 thru 5 do pP1c:endcons(subst([a=k,b=i],[a,b]),pP1c)) /* "P1cの点表示データ" */;
for k:-4 step 2 thru 5 do(for i:-5 thru 5 do pP2c:endcons(subst([a=i,b=k],[a,b]),pP2c)) /* "P2cの点表示データ" */;
pPc:listify(intersect(setify(pP1c),setify(pP2c))) /* "◆◆◆条件p:[mod(a,2)=1 or mod(b,2)=1](真理集合P=(P1)u(P2))の否定は(◆修正部分2)" */;
draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/points_joined = false,
/**/line_type = dots,
/**/color =royalblue,
/**/point_size =3,point_type =7,points(pP1c),
/**/color =red,
/**/point_size =2,point_type =7,points(pP2c),
/**/points_joined = false,
/**/color =cyan,
/**/point_size =1,point_type =7,points(pPc)
/**/) /* "◆◆P1c(青)、P2c(赤)、Pc(シアン)からPc=(P1c)n(P2c)を確認し、下に書き込む◆◆(◆修正時変更)" */;
print("(p(a奇数 or b奇数))c == (p(a奇数)c and p(b奇数c) == p(a偶数 and b偶数)") /* "(◆修正時変更)" */;

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
pP:listify(intersect(setify(pP1),setify(pP2))) /* "◆◆◆条件p:[mod(a,2)=1 or mod(b,2)=1](真理集合P=(P1)u(P2))の否定は●(◆修正部分1)" */;
pPc:append(pP1,pP2) /* "◆◆◆条件p:[mod(a,2)=1 or mod(b,2)=1](真理集合P=(P1)u(P2))の否定は●(◆修正部分2)" */;


▼コマンド番号1017
●練習69
「かつ」「または」と否定●●●●●●●●●●●●●●●●
kill(all) /* "1017 「かつ」「または」と否定(Maxima on lineでは削除)" */$
MONDAI:"1017 下の条件pについて、pの否定は" ;
R:{"自然数(正整数)","0","負整数","既約分数","負既約分数","無理数(非循環無限小数)"} /* "R実数" */;
Q:{"自然数(正整数)","0","負整数","既約分数","負既約分数"} /* "Q有理数" */;
P1:{[[a,b],"|",[[a,"E",Q],"and",[b,"E",R]]]} /* "P1(a有理数、b実数)" */;
P2:{[[a,b],"|",[[b,"E",Q],"and",[a,"E",R]]]} /* "P2(a実数、b有理数)" */;
P:{[first(P1)[1],first(P1)[2],[first(P1)[3][1] ,"or", first(P2)[3][1]]]}
/* "◆◆◆条件p:[a,b少なくとも一方は有理数](真理集合P=P1uP2)の否定は●(◆修正部分)" */;
P131:first(P1)[3][1];P231:first(P2)[3][1];
Pc:{[first(P1)[1],first(P1)[2],[append(rest(P131,-2),[setdifference(R,first(P1)[3][1][3]) ])
,"and",append(rest(P231,-2),[setdifference(R,first(P2)[3][1][3])])]]} /* "◆◆Pc(a,bはどちらも・・・)◆◆(◆修正時変更)" */;

◎条件を否定したものは、全体集合から条件を満たすものを除いたものになる。
◎条件の否定は、全体集合から条件を満たすものを除いたものの条件になる。
◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
P:{[first(P1)[1],first(P1)[2],[first(P1)[3][1] ,"and", first(P2)[3][1]]]}
/* "◆◆◆条件P[a,bともに有理数](真理集合P=P1nP2)の否定は●(◆修正部分)" */;


:  11.命題とその逆・対偶・裏
   A 命題の逆とその真偽
▼コマンド番号1101
●例43
命題の逆とその真偽●●●●●●●●●●●●●●●●
kill(all) /* "1101 命題の逆とその真偽" */$
MONDAI:"●例43 1101 命題p(a^2 =0,==>,a =0)の逆は、(◆修正部分1)"$
(TEJUN:"",
p:[a^2 =0,"==>",a =0] /* "命題p(◆修正部分2)" */,
pG:[p[3],p[2],p[1]] /* "命題pの逆" */,
P1l:solve(p[1],a),P2l:solve(p[3],a),
print(P1l,"pの仮定の真理集合"),print(P2l,"pの結論の真理集合")
)$
(SUIRON:"",
print(P1l,"仮定の真理集合"),print(P2l,"結論の真理集合") ,
print("この2つが一致しているので"),ansl:["pとpの逆との真偽は一致","答え"],print(ansl) /* "(◆修正部分3)" */
)$
(KETURON,"",
print(MONDAI),print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"●例43 1101 命題p(a =b,==>,a^2 =b^2)の逆は、(◆修正部分1)"$
p:[a =b,"==>",a^2 =b^2] /* "命題p(◆修正部分2)" */,
print("この2つが一致していないので"),ansl:["pとpの逆との真偽は一致しない","答え"],print(ansl) /* "(◆修正部分3)" */


▼コマンド番号1102
●練習70
命題の逆とその真偽●●●●●●●●●●●●●●●●
kill(all) /* "1102 命題の逆とその真偽" */$
MONDAI:"●練習70 1102 命題p((a>b),==>,(a-b>0))について、逆と真偽は一致か(◆修正部分1)" $
(TEISUU:"",
xL:5,aL:xL-0.1,bL:aL
)$
(TEJUN:"",
p:[(a>b),"==>",(a-b>0)] /* "命題p(◆修正部分2)" */,
pG:[p[3],p[2],p[1]] /* "命題Pの逆" */,
P1:{[[a,b],"|",[p[1]]]} /* "p1:a>bの真理集合平面表示データ" */,
P2:{[[a,b],"|",[p[3]]]} /* "p2:a-b>0の真理集合平面表示データ" */,
pP1:[],pP1b:[[-5,-5]],pP2:[],pP2b:[[-5,-5]],
for a:-5 step 1/10 thru 5 do(
/**/for b:-5 thru 5 do(
/*....*/C:ev(p[1],nouns,numer),
/*....*/if C then pP1:endcons([a,b],pP1),
/*....*/if C and a=b then pP1b:endcons([a,b],pP1b)))
/**//* "P1の点表示データ" */,
for b:-5 step 1/10 thru 5 do(
/**/for a:-5 thru 5 do(
/*....*/C:ev(p[3],nouns,numer),
/*....*/if C then pP2:endcons([a,b],pP2),
/*....*/if C and a-b=0 then pP2b:endcons([a,b],pP2b)))
/**//* "P2の点表示データ" */,
draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/background_color = white,
/**/points_joined = false /* "()" */,
/**/line_width =2,line_type = solid,
/**/color =royalblue,
/**/point_size =2,point_type =7,points(pP1),
/**/points_joined = false /* "(◆条件p2に等号なしならfalse)" */,
/**/line_width =10,line_type = dots,
/**/points(pP1b) /* "()" */,
/**/points_joined = false /* "()" */,
/**/line_width =1,line_type = solid,
/**/color =red,
/**/point_size =1,point_type =7,points(pP2),
/**/points_joined = false /* "(◆条件p2に等号なしならfalse)" */,
/**/line_width =8,line_type = dots,
/**/points(pP2b) /* "()" */
/**/) /* "◆pの仮定の真理集合P1(青)、pの結論の真理集合P2(赤)から判断◆" */
)$
(SUIRON:"",
print(p[1],"仮定の真理集合P1(青)"),print(p[3],"結論の真理集合P2(赤)") ,
print("この2つが一致しているので"),ansl:["pとpの逆との真偽は一致","答え"],print(ansl) /* "(◆修正部分3)" */
)$
(KETURON,"",
print(MONDAI),print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"●練習70 1102 命題p((a=b and b=0),==>,(a+b=0))について、逆と真偽は一致か(◆修正部分1)" $
p:['(a=b and b=0),"==>",(a+b=0)] /* "命題p(◆修正部分2)" */,
print("この2つが一致していないので"),ansl:["pとpの逆との真偽は一致しない","答え"],print(ansl) /* "(◆修正部分3)" */


▼コマンド番号1103
●例44
命題の対偶●●●●●●●●●●●●●●●●
kill(all) /* "1103 命題の対偶" */$
MONDAI:"●例44 1103 nを自然数として、命題p(n:4の倍数==>n:2の倍数)の対偶は、(◆修正部分1)"$
(TEISUU:"",
kM:10
)$
(TEJUN:"",
p1:mod(n,4)=0 /* "仮定p1:nは4の倍数(◆修正部分2)" */,
p2:mod(n,2)=0 /* "結論p2:nは2の倍数(◆修正部分2)" */,
p:[p1,"==>",p2] /* "命題p:p1==>p2" */,
p1c:mod(n,4)#0 /* "p1の否定(◆修正部分3)" */,
p2c:mod(n,2)#0 /* "p2の否定(◆修正部分3)" */,
pT:[p2c,p[2],p1c] /* "Pの対偶" */
)$
(KAKUNIN:"",
Pc:[]/*n< kM でのpの反例*/,
for k:1 thru kM do if (not subst(n=k,p1)) or subst(n=k,p2) then print("k:",k,"p1:",subst(n=k,p1),"p2:",subst(n=k,p2)) else Pc:endcons(k,Pc),
print(Pc,"n< kM でのpの反例"),
PTc:[]/*n< kM でのpの反例*/,
for k:1 thru kM do if (not subst(n=k,p2c)) or subst(n=k,p1c) then print("k:",k,"p2c",subst(n=k,p2c),"p1c", subst(n=k,p1c)) else PTc:endcons(k,PTc),
print(PTc,"n< kM でのpTの反例")
)$
(SUIRON:"",
print(p,"命題p"),
print(p1c,"仮定p1の否定"),
print(p2c,"結論p2の否定"),
print(pT,"命題pの対偶pT"),
ansl:[["n:2の倍数でない",p[2],"n:4の倍数でない"],"答え"],print(ansl)/*(◆修正部分4)*/
)$
(KETURON,"",
print(MONDAI),print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"●例44 1103 nを自然数として、命題p(2*nは偶数==>nは偶数)の対偶は、(◆修正部分1)"$
p1:mod(2*n,2)=0 /* "仮定p1:2*nは偶数(◆修正部分2)" */,
p2:mod(n,2)=0 /* "結論p2:nは偶数(◆修正部分2)" */,
p1c:mod(2*n,2)#0 /* "p1の否定(◆修正部分3)" */,
p2c:mod(n,2)#0 /* "p2の否定(◆修正部分3)" */,
ansl:[["nは偶数でない",p[2],"2*nは偶数でない"],"答え"],print(ansl)/*(◆修正部分4)*/


▼コマンド番号1104
●例44
命題の対偶とその真偽●●●●●●●●●●●●●●●●
kill(all) /* "1104 命題の対偶とその真偽" */$
MONDAI:"1104 命題p(nは6の倍数==>nは3の倍数)とその対偶は、真偽は、(◆修正部分1)" $
(TEISUU:"",
xL:10,aL:xL-0.1,bL:aL
)$
(TEJUN:"",
p1:['mod(n,6)=0] /* "p1:nは6の倍数(◆修正部分2)" */,
p2:['mod(n,3)=0] /* "p2:nは3の倍数(◆修正部分2)" */,
p:[p1,"==>",p2] /* "命題p:p1==>p2" */,
p1c:['not(p1[1])] /* "p1の否定(◆修正部分3)" */,
p2c:['not(p2[1])] /* "p2の否定(◆修正部分3)" */,
pT:[p2c,p[2],p1c] /* "命題pの対偶pT" */,

pP1:[],pP1c:[],pP2:[],pP2c:[] /* "(◆修正部分4ここから)" */,
for n:-xL step 1 thru xL do(
/**/if ev(p1[1] ,nouns,numer) then pP1:endcons([n,1],pP1)
/*....*/else pP1c:endcons([n,1],pP1c))
/**//* "p1,p1cの点表示データ()" */,
for n:-xL step 1 thru xL do(
/**/if ev(p2[1] ,nouns,numer) then pP2:endcons([n,1],pP2)
/*....*/else pP2c:endcons([n,1],pP2c))
/**//* "p2,p2cの点表示データ(◆修正部分4ここまで)" */
)$
(KAKUNIN1:"",
print("p",p,"におけるp1の真理集合P1(青)、p2の真理集合P2(赤)"),
draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/background_color = white,
/**/points_joined = false,
/**/line_width =2,line_type = solid,
/**/color =royalblue,
/**/point_size =2,point_type =7,points(pP1),
/**/points_joined = false,
/**/line_width =1,line_type = solid,
/**/color =red,
/**/point_size =1,point_type =7,points(pP2)
/**/) /* "◆◆P1(青)、P2(赤)からp1==>p2を判断◆◆" */
)$
(KAKUNIN2:"",
print("pT",pT,"におけるp2cの真理集合P2c(青)、p1cの真理集合P1c(赤)"),
draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/background_color = white,
/**/points_joined = false,
/**/line_width =2,line_type = solid,
/**/color =royalblue,
/**/point_size =2,point_type =7,points(pP2c),
/**/points_joined = false,
/**/line_width =1,line_type = solid,
/**/color =red,
/**/point_size =1,point_type =7,points(pP1c)
/**/) /* "◆◆P2c(青)、P1c(赤)からp2c==>p1cを判断◆◆" */
)$
(SUIRON:"",
print("p",p,"命題p"),
print(p[1],"pの仮定"),print(p[3],"pの結論") ,
print(p1c,"pの仮定の否定"),print(p2c,"pの結論の否定") ,
print("pT",pT,"命題pの対偶pT"),
print("命題pとその対偶pTの真理集合はともに整数全体だから、"),ansl:["pT",pT,"命題pとその対偶pTとの真偽は一致","答え"],print(ansl) /* "(◆修正部分5)" */
)$
(KETURON,"",
print(MONDAI),print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
MONDAI:"1104 命題p(m,nはともに奇数==>m+nは偶数)とその対偶は、真偽は、(◆修正部分1)" $
p11:['mod(m,2)=1] /* "p11:mは奇数(◆修正部分2)" */,
p12:['mod(n,2)=1] /* "p12:nは奇数(◆修正部分2)" */,
p1:['(mod(m,2)=1 and mod(n,2)=1)] /* "pの仮定p1(◆修正部分2)" */,
p2:['(mod(m+n,2)=0)] /* "pの結論p2(◆修正部分2)" */,
p1c:['not(mod(m,2)=1) or 'not(mod(n,2)=1)] /* "p1の否定(◆修正部分3)" */,
p2c:['not(mod(m+n,2)=0)] /* "p2の否定(◆修正部分3)" */,

pP11:[],pP11c:[],pP12:[],pP12c:[],pP2:[],pP2c:[] /* "(◆修正部分4ここから)" */,
for m:-xL thru xL do( for n:-xL thru xL do(if mod(m,2)=1 then pP11:endcons([m,n],pP11) else pP11c:endcons([m,n],pP11c)))
/**//* "p11,p11cの点表示データ" */,
for m:-xL thru xL do( for n:-xL thru xL do(if mod(n,2)=1 then pP12:endcons([m,n],pP12) else pP12c:endcons([m,n],pP12c)))
/**//* "p12,p12cの点表示データ" */,
pP1:listify(intersect(setify(pP11),setify(pP12))) /* "p1:m,nともに奇数" */,
pP1c:append(pP11c,pP12c) /* "p1c:m,nどちらかは偶数" */,
for m:-xL thru xL do( for n:-xL thru xL do(if mod(m+n,2)=0 then pP2:endcons([m,n],pP2) else pP2c:endcons([m,n],pP2c)))
/**//* "p2:m+nは偶数,p2cの点表示データ(◆修正部分4ここまで)" */
print("命題pとその対偶pTの真理集合はともに整数全体だから、"),ansl:["pT",pT,"命題pとその対偶pTとの真偽は一致","答え"],print(ansl) /* "(◆修正部分5)" */


:  12.命題と証明
   A 対偶を利用する証明
▼コマンド番号1201
●例題12
対偶を利用する証明●●●●●●●●●●●●●●●●
kill(all) /* "1201 対偶を利用する証明" */$
MONDAI:"●例題12 1201 命題p(nが整数で、n^2が偶数ならば、nは偶数)を示せ(◆修正部分1)" $
(TEISUU:"",
xL:5,aL:xL-0.1,bL:aL,mS:4
)$
(TEJUN1:"",
p1:['mod(n^2,2)=0,nEZ] /* "nが整数で、n^2が偶数" */,
p2:['mod(n,2)=0,nEZ] /* "nが整数で、偶数" */,
p:[p1,"==>",p2] /* "命題p: p1 ==> p2" */,
p1c:['not p1[1]] /* "nが整数で、n^2が奇数" */,
p2c:['not p2[1]] /* "nが整数で、奇数" */,
pT:[p2c,"==>",p1c] /* "pの対偶" */,
P1:{[[0,n],"|",[nEZ,'mod(n^2,2)=0]]} /* "p1:(nEZ,mod(n^2,2)=0)の真理集合平面表示データ(◆修正部分2)" */,
P2:{[[0,n],"|",[nEZ,'mod(n,2)=0]]} /* "p2:(nEZ,mod(n,2)=0)の真理集合平面表示データ(◆修正部分2)" */,
pP1:[],pP2:[] ,
for i:-xL thru xL do(
/**/pk:ev(subst(n=i,first(P1)[3][2]),nouns,numer),
/**/if pk then pP1:endcons([i,0],pP1))
/**//* "P1の点表示データ" */,print("pP1",pP1),
for i:-xL thru xL do(
/**/pk:ev(subst(n=i,first(P2)[3][2]),nouns,numer),
/**/if pk then pP2:endcons([i,0],pP2))
/**//* "P2の点表示データ" */,print("pP2",pP2)
)$
(KAKUNIN:"",
print("p",p,"におけるp1の真理集合P1(青)、p2の真理集合P2(赤)"),
draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/background_color = white,
/**/points_joined = false,
/**/line_width =2,line_type = solid,
/**/color =royalblue,
/**/point_size =2,point_type =7,points(pP1),
/**/points_joined = false,
/**/line_width =1,line_type = solid,
/**/color =red,
/**/point_size =1,point_type =7,points(pP2)
/**/) /* "◆◆P1(青)、P2(赤)からp1==>p2を判断◆◆" */
)$
(SUIRON:"",
print("p",p),
print("背理法で、対偶命題pTを示す。"),
print("pT",pT),
print("pT","nが奇数==>n^2が奇数"),
print(["n=2*m+1 (m EZ)",2*mS+1,"整数nを奇数とする"]),
print(["n^2=(2*m+1)^2",(2*mS+1)^2]),
print([" =4*m^2+4*m+1",4*mS^2+4*mS+1]),
print([" =2*(2*m^2+2*m)+1 (2*m^2+2*m EZ)",2*mS^2+2*mS]),
print(["n^2は奇数"]),
ansl:["対偶命題が成立したので、命題は成立","答え"],print(ansl)
)$
(KETURON:"",
print(MONDAI),
print(ansl)
)&

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを実行し、グラフ出力を考察せよ。


   B 対偶を利用する証明
▼コマンド番号1202
●例題13
背理法を利用する証明●●●●●●●●●●●●●●●●
kill(all) /* "1202 背理法を利用する証明" */$
MONDAI:"●例題13 1202 ●命題p(r(2)が無理数として、1+r(2)は無理数)を示せ。" $
(TEJUN:"",
p:[1+sqrt(2),"E",I] /* "1+r(2)は無理数" */,
pc:[1+sqrt(2)=n/m,nEZ,mEN] /* "命題pの否定:1+r(2)は分子が整数、分母が自然数の分数(有理数)" */,
e:pc[1] /* "上の等式をeとする" */,
e2:e-1 /* "両辺から1を引く" */,
e3:rat(e2) /* "◆◆右辺を通分し、その結果から、有理数か無理数か判断◆◆" */
)$
("SUIRON:",
print(["p",p]),
print(["pc",pc,"命題pの否定"]),
print(e),print(e2),print(e3),
print([e3,"左辺は仮定により無理数"]),
print([e3,"右辺は整数の分数だから有理数"]),
ansl:[e3,"1+√(2)を有理数とすると、ここで矛盾が生じたので、背理法により、命題が成立","答え"],print(ansl)
)$
(KETURON:"",
print(MONDAI),
print(ansl)
)$

◎上のMaximaコマンドを実行せよ。
◎上のコマンドの結果について考察せよ。
◎◎「命題を否定すると、矛盾が生じたので、背理法により、元の命題が成立する」と明示すること。
◎◎この例題は、「r(2)が無理数ならば、1+r(2)が無理数」と考えると、「対偶を利用する証明」と見なせる。しかし、r(2)が有理数となることはあり得ないので、「背理法を利用する証明」と呼ばれる。


:  補充問題・章末問題
    補充問題
▼コマンド番号10401
●補充問題13
対偶を利用する証明●●●●●●●●●●●●●●●●
kill(all) /* "10401 対偶を利用する証明" */;
MONDAI:"10401 ●下の命題pについて、" ;
p1:[a+bEI,aER,bER] /* "a,bが実数で、a+bが無理数" */;
p21:[aEI] /* "aが無理数" */;
p22:[bEI] /* "bが無理数" */;
p2:[p21 or p22] /* "a,bの一方は無理数" */;
p:[p1,"==>",p2] /* "●命題p:a+bが無理数ならa,bの一方は無理数の対偶を述べ、その真偽は●" */;

p1c:[a+b=n/m,nEZ,mEN] /* "a+bが有理数" */;
p21c:[a=n1/m1,n1EZ,m1EN] /* "aが有理数" */;
p22c:[b=n2/m2,n2EZ,m2EN] /* "bが有理数" */;
p2c:[p21c and p22c] /* "aもbも有理数" */;
pT:[p2c,"==>",p1c] /* "pの対偶pT◆◆aもbも有理数ならa+bは有理数◆◆" */;
e:lhs(p1c[1]) /* "p1cの等式の左辺" */;
e:subst([p21c[1],p22c[1]],e) /* "p21c、p22cの等式をp1cの等式の左辺に代入" */;
e:rat(e) /* "代入結果を整理◆◆a+bが有理数か判断◆◆" */;
print("pTは真だからpは真") /* "(◆修正時変更)" */;

◎上のMaximaコマンドを実行せよ。
◎上のコマンドの結果について考察せよ。


▼コマンド番号10402
●補充問題14
必要条件・十分条件●●●●●●●●●●●●●●●●
kill(all) /* "10402 必要条件・十分条件" */;
MONDAI:"10402 ●下の命題p1,p2について、" ;
p11:[a#0] /* "aが0でない(◆修正部分)" */;
p12:[b#0] /* "bが0でない(◆修正部分)" */;
p1:['(a#0 and b#0)] /* "●命題p1:a#0 かつ b#0 は(◆修正部分)" */;
p2:['a*b#0] /* "●命題p2:a*bが0でない の何条件か●(◆修正部分)" */;
m1:a /* "文字1はa(◆修正部分)" */;
m2:b /* "文字2はb(◆修正部分)" */;
s1:1/5 /* "ステップ1は1/5(◆修正部分)" */;
s2:1 /* "ステップ2は1(◆修正部分)" */;

xL:5;aL:xL-0.1;bL:aL;
pP1:[[5,5]];pP1c:[[5,5]];pP2:[[5,5]];pP2c:[[5,5]];

for i:-xL step s1 thru xL do(
/**/for j:-xL step s2 thru xL do(
/*....*/C:subst([m1=i,m2=j],p1[1]),
/*....*/if ev(C,nouns,numer) then pP1:endcons([i,j],pP1)
/*........*/else pP1c:endcons([i,j],pP1c)))
/**//* "p1,p1cの点表示データ()" */;
for j:-xL step s1 thru xL do(
/**/for i:-xL step s2 thru xL do(
/*....*/C:subst([m1=i,m2=j],p2[1]),
/*....*/if ev(C,nouns,numer) then pP2:endcons([i,j],pP2)
/*........*/else pP2c:endcons([i,j],pP2c)))
/**//* "p2,p2cの点表示データ()" */;
pP1; pP1c; pP2; pP2c; draw2d(xrange = [-aL,aL], yrange = [-bL,bL],
/**/background_color = white,
/**/points_joined = false /* "(◆修正時falseに変更)" */,
/**/line_width =2,line_type = solid,
/**/color =royalblue,
/**/point_size =2,point_type =7,points(pP1),
/**/color =white,
/**/points(pP1c),
/**/points_joined = false /* "(◆修正時falseに変更)" */,
/**/line_width =1,line_type = solid,
/**/color =red,
/**/point_size =1,point_type =7,points(pP2)
, /**/color =white,
/**/points(pP2c)
/**/) /* "◆P1(青)、P2(赤)からp1==>p2,p2==>p1を判断◆" */;
print("p1はp2の必要十分条件") /* "(◆修正時変更)" */;

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
p1:[mod(m*n,2)=0] /* "p1:m*nが偶数(◆修正部分)" */;
p2:[mod(m,2)=0] /* "p2:mが偶数(◆修正部分)" */;
m1:m /* "文字1はa(◆修正部分)" */;
m2:n /* "文字2はb(◆修正部分)" */;
s1:1 /* "ステップ1は1/5(◆修正部分)" */;
s2:1 /* "ステップ2は1(◆修正部分)" */;


▼コマンド番号10403
●章末問題9
因数分解●●●●●●●●●●●●●●●●
kill(all) /* "10403 因数分解" */;
MONDAI:"10403 ●次の式について、" ;
e:2*(n+1)^3-3*n*(n+1)^2-2*(n+1) /* "因数分解せよ●(◆修正部分)" */;
q1:n+1 /* "共通因数をq1として(◆修正時変更)" */;
q1e:quotient(e,q1) /* "eをq1で割って、商をq1eとして" */;
q2:n /* "q1eの共通因数をq2として(◆修正時変更)" */;
q2e:quotient(q1e,q2) /* "q1eをq2で割って、商をq2eとして" */;
E:q1*q2*q2e /* "これらの積が因数分解・・・" */;
factor(e);

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
e:a*b*(a-b) +b*c*(b-c) +c*a*(c-a) /* "因数分解せよ●(◆修正部分)" */;


▼コマンド番号10404
●章末問題13
無理式の計算●●●●●●●●●●●●●●●●
kill(all) /* "10404 無理式の計算" */;
MONDAI:"10404 ●次の式について、" ;
e:sqrt(x^2)+sqrt(x^2-4*x+4);
c1:x<0 /* "条件x<0において、上の式を簡約せよ●(◆修正部分)" */; e1:sqrt(x^2) /* "第1項をe1と置いて(◆修正時変更)" */;
e1:-x /* "条件にしたがって√を外し(◆修正時変更)" */;
e2:sqrt(x^2-4*x+4) /* "第2項をe2と置いて(◆修正時変更)" */;
e2:sqrt(factor(e2^2)) /* "√の中を因数分解して(◆修正時変更)" */;
e2:-(x-2) /* "(◆修正時変更)" */;
e:e1+e2;

◎上のMaximaコマンドを実行せよ。
◎上のコマンドを、次により修正して実行し、結果を比較して考察せよ。
c1:0<x and x<2 /* "条件0<x and x<2において、上の式を簡約せよ●(◆修正部分)" */;

▼コマンド番号10405
●章末問題14
背理法による証明●●●●●●●●●●●●●●●●
kill(all) /* "10405 背理法による証明" */;
MONDAI:"10405 ●次の前提条件のとき、下の命題の成立を示せ。" ;
c0:r2EI /* "前提条件:r2は√(2)のこと。r2が無理数であることを用いて" */;
c1:[p+q*r2=0] /* "●命題:条件c1が成り立てば次の結論c2を得る。●" */;
c2:[p=0 ,"and", q=0] /* "結論c2" */;
c2c:[p#0 ,"or", q#0] /* "c2を否定すると、" */;
case1:[p#0 ,"and", q=0];
subst(q=0,c1)[1] and case1[1];
case2:[p=0,"and",q#0];
subst(p=0,c1)[1] and case2[3];
case3:[p#0,"and",q#0];
r2L:solve(c1[1],r2);
print("r2が有理数となって、r2が無理数という前提条件に矛盾するので、命題が成立");

◎上のMaximaコマンドを実行せよ。
◎上のコマンドの実行結果を考察せよ。