Backup diff of Examples (No. 5)


  • The added line is THIS COLOR.
  • The deleted line is THIS COLOR.
* 例題 [#gabe06d3]
-さまざまな例題について説明する
* bouncing_particle [#p560bc2f]
* A Bouncing Particle [#p560bc2f]
>
~ // bouncing particle
// y stands for the height of the ball
~ INIT <=> y = 10 & y' = 0. // initial state
~ FALL <=> [](y'' = -10).   // falling
~ BOUNCE <=> [](y- = 0 => y' = -4/5*y'-). // if the ball reaches the ground, it bounces
~ 
~ INIT <=> y = 10 & y' = 0.
~ FALL <=> [](y'' = -10).
~ BOUNCE <=> [](y- = 0 => y' = -4/5*y'-).
~ INIT, FALL << BOUNCE. // FALL is weaker than BOUNCE
<
&ref(./bouncing_particle.png,50%);
----
* Bouncing Particle with a Parameter [#z5246173]
>
~ 
~ INIT   <=> 5 < y < 15 & y' = 0. // the initial height is uncertain
~ FALL   <=> [](y''  = -10).
~ BOUNCE <=> [](y- = 0 => y' = -4/5 * vy'-).
~ 
~ INIT, FALL << BOUNCE.
<
- このプログラムは, 床(y=0)で跳ね返る質点のモデルとなる
- 変数yは位置(高さ)を表し, 上向きを正とする
- 初期値は, 高さ10(y=10)で速度0(y'=0)から始まる(INIT)
- 重力加速度は-10となる(FALL)
- 床(y=0)に衝突すると跳ね返る(BOUNCE)
- 跳ね返る際は, 逆向きに4/5倍になる(y' = -4/5*y'-)
&ref(./bouncing_particle.png,50%);
&ref(./bouncing_particle_rp.png,50%);
----
* bouncing_particle_U [#j8167ade]
* A Bouncing Paticle on a Curve [#j8167ade]
>
~ /**
~  *  bouncing particle in f(x) = (1/2) * x^2
~  *  bouncing particle on a curve of f(x) = (1/2) * x^2
~  */
~ 
~ INIT <=> x = 1/2 & y = 10 & x' = 0 & y' = 0 & [](k = 1).
~ A <=> [](x" = 0 & y" = -98/10).
~ /**
~  *     sin = f'(x) / (1+f'(x))^(1/2)
~  *     cos =     1 / (1+f'(x))^(1/2)
~  *  new x' = (-k * sin^2 + cos^2) * x' + (k+1) * sin * cos      * y'
~  *  new y' = (k+1) * sin * cos    * x' + (sin^2 + (-k) * cos^2) * y'
~  */
~ 
~ SC <=> [](s = (x-)/(1+(x-)^2)^(1/2)
~         & c = 1   /(1+(x-)^2)^(1/2)).
~ 
~ BOUNCE <=> [](y- = (1/2) * (x-)^2 => 
~                        x' = ( (-k) * s^2 + c^2 ) * x'-
~                             + ( (k+1) * s * c ) * y'-
~                      & y' = ( (k+1) * s * c ) * x'-
~                             + ( s^2 + (-k) * c^2 ) * y'- ).
~ 
~ INIT, SC, A << BOUNCE.
<
- このプログラムは, U字型のハーフパイプのような床(f(x) = (1/2) * x^2)を跳ねる質点のモデルとなる
- 質点は二次元の座標系を運動し, その位置はxy座標で表される
- 制約Aは, 質点の加速度のx成分y成分に関して定義している
- 跳ねる際の位置によって跳ね返りの運動の様子が変わる(BOUNCE)
-- 変数s,cは跳ね返り後の質点の運動を計算するために用いられる
&ref(./bouncing_particle_U.png,30%);
----
* bouncing_particle_rp [#z5246173]
* A Bouncing Particle in a Circle [#xbf24e18]
>
~ // bouncing particle with parameter
~ 
~ INIT   <=> 5 < ht < 15 & v = 0 & e =4/5 & [](ht' = v & e'=0).
~ FALL   <=> [](v'  = -10).
~ BOUNCE <=> [](ht- = 0 => v = -e * v-).
~ 
~ INIT, FALL << BOUNCE.
<
- このプログラムは, 跳ねる質点のモデルだが初期位置が(5,15)のパラメータであるモデルとなる
- 質点の高さ(位置)はhtで表され, 速度はvで表される
- 跳ね返る反発係数はeとなり, 制約INITで4/5なっている
- 質点の初期位置によってそれぞれどのような運動になるのか分かる
&ref(./bouncing_particle_rp.png,50%);
----
* bouncing_particles [#cd9b6075]
>
~ // many bouncing particles
~ 
~ INIT(y, y0) <=> y = y0 & y' = 0.
~ FALL(y) <=> [](y'' = -10).
~ BOUNCE(y) <=> [](y- = 0 => y' = -y'-).
~ 
~ BALL(yarg, y0){INIT(yarg, y0), FALL(yarg) << BOUNCE(yarg)}.
~ 
~ BALL(y1, 1), BALL(y2, 2),BALL(y3, 3), BALL(y4, 4),BALL(y5, 5),
~ BALL(y6, 6), BALL(y7, 7), BALL(y8, 8). BALL(y9, 9), BALL(y10, 10),
~ BALL(y11, 11),BALL(y12, 12), BALL(y13, 13), BALL(y14, 14).
~ BALL(y15, 15), BALL(y16, 16).
<
- このプログラムは, 複数の質点が跳ねるモデルとなる
- 跳ね返りは反発係数e=1の完全弾性衝突となる
- プログラム呼び出し(BALL(yarg, y0))による、呼び出しで16個の質点が定義されている
-- 質点の位置は, 一次元上(y軸)で考える
-- 質点の初期位置は, y1からy16まで1ずつずれた位置となる
&ref(./bouncing_particles.png,40%);
----
* circle [#xbf24e18]
>
~ //circle.hydla
~ //bouncing particle in a circle
~ 
~ INIT   <=> x = 0 /\ 0.5 < y < 0.6 /\ x' = 2 /\ y' = 1.
~ INIT   <=> x = 0 /\ 0.5 < y < 0.6 /\ x' = 2 /\ y' = 1. // the initial position is uncertain
~ RUN    <=> [](x" = 0 /\ y" = 0).
~ BOUNCE <=> []((x-)^2 + (y-)^2 = 1 => 
~                 x' = x'- - (x- * x'- + y- * y'-) * 2 * (x-) /\
~                 y' = y'- - (x- * x'- + y- * y'-) * 2 * (y-)
~ ).
~ INIT, RUN<<BOUNCE.
<
- このプログラムは, 円の内部を跳ね返る質点のモデルとなる
- 質点の位置はxy座標で表される
- 質点のy座標の初期値はパラメータで(0.5,0.6)となる
- 質点の初期値のパラメータは, 実行が進むにつれて幅が広がっていくのが分かる
&ref(./circle.png,30%);
----
* baloon_tank [#tf906f5e]
* A hot-air balloon [#tf906f5e]
>
~ /* A program for a hot-air balloon rising by fuel tanks that are exchanged. */
~ 
~ INIT<=>h=10/\h'=0/\fuel=1/\timer=0
~         /\2<exT<4
~         ///\ exT = 3
~         /\ 1<volume<3.
~ 
~ CONS<=>[](exT'=0/\volume'=0).
~ TIME<=>[](timer'=1).
~ 
~ BURN<=>[](fuel=1=>h''=1).
~ FALL<=>[](fuel=0=>h''=-2).
~ 
~ VOID<=>[](timer->=volume=>fuel=0).
~ FULL<=>[](timer-<volume=>fuel=1).
~ 
~ COMP<=>
~   [](timer->=volume+exT=>timer=0).
~ 
~ ASSERT(h>0).
~ 
~ INIT,CONS,BURN,FALL,VOID,FULL,TIME<<COMP.
- An example with multiple parameters.
~/* A program for a hot-air balloon that repeats rising and falling */
~// The initial condition of the balloon and the timer
~// h: height of the balloon
~// timer: timer variable to repeat rising and falling
~INIT <=> h = 10 /\ h' = 0 /\ timer = 0.
~
~// parameters 
~// duration: duration of falling 
~// riseT: duration of rising 
~PARAM<=> 1 < fallT < 4 /\ 1 < riseT < 3  
~                      /\ [](riseT' = 0 /\ fallT' = 0). 
~
~// increasing of timer 
~TIMER <=> [](timer' = 1). 
~
~// rising of the balloon
~RISE <=> [](timer- < riseT =>h'' = 1).
~
~// falling of the balloon
~FALL <=> [](timer- >= riseT => h'' = -2).
~
~// reset the timer to repeat rising and falling
~RESET <=> [](timer- >= riseT + fallT => timer=0).
~
~// assertion for bounded model checking
~ASSERT(h > 0).
~
~// constraint hierarchies
~INIT, PARAM, FALL, RISE, TIMER<<RESET.
<
- このプログラムは, 燃料によって上下する気球のモデルとなる
- 気球の位置はy軸上で考えている
- 気球は動いている時刻(timer)によって, 燃料がある状態と燃料がない状態がある(VOID,FULL)
- 気球は燃料がある状態(fuel=1)なら上昇(h"=1)していき, 燃料がない状態(fuel=0)なら下降(h"=-2)する
- 燃料がなくなると新しい燃料に交換する, その際にある時間(exT)がかかり, 完了するともう一度燃料がある状態となる(COMP)
- 実行が進むにつれて気球がどのように運動するか分かる
&ref(./balloon_tank.png,25%);
----
* magnet_ball [#a6ea3f5c]
* A Bouncing Particle with Magnetic Force [#a6ea3f5c]
>
~ /*
~ 重力と磁力の影響を考えたボールの動き
~ 磁力は重力と逆向きに働き、スイッチでON/OFFできる
~ スイッチは1秒ごとに切り替えられる可能性がある
~ */
~ 
~ INIT <=> y=10 & y'=0 & mag=0 & timer=0.
~ FALL <=> [](y''=-10+mag).
~ BOUNCE <=> [](y-=0=>y'=-y'-).
~ TRUE <=> [](1=1).
~ TIMER <=> [](mag'=0&timer'=1).
~ SWITCHON <=> [](timer-=1=>mag=12&timer=0).
~ SWITCHOFF <=> [](timer-=1=>mag=0&timer=0).
~ SWITCHW <=> [](timer-=1=>mag=100&timer=0).
~ SWITCHON <=> [](timer-=1=>mag=12&timer=0). // The magnetic force may be switched on at every one second
~ SWITCHOFF <=> [](timer-=1=>mag=0&timer=0). // The magnetic force may be switched off at every one second
~ 
~ INIT,TIMER<<(SWITCHOFF,SWITCHON,SWITCHW)<<TRUE,FALL.
~ INIT,TIMER<<(SWITCHOFF,SWITCHON)<<TRUE,FALL.
< 
- 一定時間(timer=1)ごとにスイッチが切り替わり, スイッチによって質点の運動がかわる
- どのスイッチに切り替わるのかは非決定的となる
----
* stadium [#oab94af0]
* A Bouncing Particle thrown toward a ceiling [#e682ba1f]
>
~ INIT   <=> x=3/4 /\ y=0 /\ x'=2 /\ y'=1.
~ RUNX    <=> [](x''=0).
~ RUNY    <=> [](y''=0).
~ WALL1 <=> []( (x- - 1)^2+(y-)^2=1 & x > 1=> 
~     x' = x'- - ( (x- -1)*x'- +y*y'-)*(1+1)*(x- -1) /\
~     y' = y'- - ( (x- -1)*x'- + y-*y'-)*(1+1)*(y-)).
~ WALL2 <=> []((x- + 1)^2+(y-)^2=1 & x < -1=> 
~     x' = x'- - ( (x- +1)*x'- +y*y'-)*(1+1)*(x- +1) /\
~     y' = y'- - ( (x- +1)*x'- + y-*y'-)*(1+1)*(y-)).
~ WALL3 <=> [](y- = 1 => y' = -y'-).
~ WALL4 <=> [](y- =-1 => y' = -y'-).
~ 
~ INIT, (RUNX, RUNY)<<(WALL1,WALL2,WALL3,WALL4).
<
- このプログラムは, スタジアムのようなフィールドを運動する質点のモデルとなる
- 質点の位置はxy座標で表される
- スタジアムの壁の形状とそれとの衝突の様子をWALL1,WALL2,WALL3,WALL4のそれぞれの制約で表している
----
* throw_ball [#wd37993f]
>
~ // throwing ball against head wind
~ 
~ INIT <=> x = 0 & y = 10 & x' = 10 & 10 < y' < 15.
~ INIT <=> 9 < y < 11 & y' = 10. 
~ FALL <=> [](y'' = -10).
~ WIND <=> []( (y- >= 15 => x" = -3) & (y- < 15 =>  x" = 0)).
~ 
~ INIT, FALL, WIND.
~ 
~ //ASSERT(!(x >= 25 & y > 0)).
<
- このプログラムは, 質点を投げ上げるモデルとなる
- 質点の位置(高さy)によって風の影響が存在する
-- 高いと強い風の影響があり, 低いと風は影響しない
- ボールの投げ上げる初期速度(y')がパラメータで与えられている
- ボールの初期速度によって運動が変化しているのが分かる
&ref(./throw_ball.png,30%);
----
* roof_bouncing [#e682ba1f]
>
~ // bouncing particle to a roof
~ 
~ INIT <=> 9 < y < 11 & y' = 10.
~ FALL <=> [](y'' = -10).
~ BOUNCE <=> [](y- = 15 => y' = -(4/5)*y'-).
~ 
~ INIT, FALL << BOUNCE.
<
- このプログラムは, 天井に向かって投げ上げる質点のモデルとなる
- 質点は投げ上げる位置によって, 天井にぶつかるかぶつからないか運動が異なる
- 天井に向かって投げ上げる質点の運動の様子(解軌道)が分かる
- In this program, the trajectories change qualitatively dependent on the initial height y0.
-- If 9 < y0 < 10, the ball doesn't reaches the ceiling.~
-- If y0 = 10, the ball touches the ceiling, but the velocity remains continuous.~
-- If 10 < t < 11, the ball bounces on the ceiling.~
- HyLaGI performs such a case analysis automatically.~
&ref(./roof_bouncing.png,40%);
----