Input static SVG SVG Image
Input text prompt
<svg>...</svg>
Scale the white circle in y to 0.1 in 0.6 seconds, and then scale it back up. Do this again. Move the blue and black circles to align their left edges to the white circle. Then repeat to align their right edges. Then move them back to the center of the white circle. Then scale the white circle down and up again.

MoVer program
o_1 = iota(Object, lambda o: color(o, "white") and shape(o, "circle"))
o_2 = iota(Object, lambda o: color(o, "blue") and shape(o, "circle"))
o_3 = iota(Object, lambda o: color(o, "black") and shape(o, "circle"))

m_1 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and duration(m, 0.6) and agent(m, o_1))
m_2 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1))
m_3 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and not m_1)
m_4 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and not m_2)

m_5 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_2, o_1)) and agent(m, o_2))
m_6 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_3, o_1)) and agent(m, o_3))
m_7 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_2, o_1)) and agent(m, o_2))
m_8 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_3, o_1)) and agent(m, o_3))

m_9 = iota(Motion, lambda m: type(m, "translate") and not post(m, s_border(o_2, o_1)) and agent(m, o_2) and not m_5 and not m_7)
m_10 = iota(Motion, lambda m: type(m, "translate") and not post(m, s_border(o_3, o_1)) and agent(m, o_3) and not m_6 and not m_8)

m_11 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and not m_1 and not m_3)
m_12 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and not m_2 and not m_4)

t_before(m_1, m_2)
t_before(m_2, m_3)
t_before(m_3, m_4)

t_before(m_4, m_5)
t_while(m_5, m_6)

t_before(m_6, m_7)
t_while(m_7, m_8)

t_before(m_8, m_9)
t_while(m_9, m_10)

t_before(m_10, m_11)
t_before(m_11, m_12)
Initial animation without correction
Verification report
o_1 = iota(Object, lambda o: color(o, "white") and shape(o, "circle")): True
color: True
shape: True

o_2 = iota(Object, lambda o: color(o, "blue") and shape(o, "circle")): True
color: True
shape: True

o_3 = iota(Object, lambda o: color(o, "black") and shape(o, "circle")): True
color: True
shape: True

m_1 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and duration(m, 0.6) and agent(m, o_1)): True
type: True
direction: True
magnitude: True
origin: True
duration: True
agent: True

m_2 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1)): True
type: True
direction: True
origin: True
agent: True

m_3 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_1)): True
type: True
direction: True
magnitude: True
origin: True
agent: True

m_4 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_2)): True
type: True
direction: True
origin: True
agent: True

m_5 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_2, o_1)) and agent(m, o_2)): False
type: True
post: False
s_left_border: True
agent: True

m_6 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_3, o_1)) and agent(m, o_3)): False
type: True
post: False
s_left_border: True
agent: True

m_7 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_2, o_1)) and agent(m, o_2)): True
type: True
post: True
s_right_border: True
agent: True

m_8 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_3, o_1)) and agent(m, o_3)): False
type: True
post: False
s_right_border: False
agent: True

m_9 = iota(Motion, lambda m: type(m, "translate") and (not post(m, s_border(o_2, o_1))) and agent(m, o_2) and (not m_5) and (not m_7)): True
type: True
post: True
s_border: True
agent: True

m_10 = iota(Motion, lambda m: type(m, "translate") and (not post(m, s_border(o_3, o_1))) and agent(m, o_3) and (not m_6) and (not m_8)): True
type: True
post: False
s_border: True
agent: True

m_11 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_1) and (not m_3)): True
type: True
direction: True
magnitude: True
origin: True
agent: True

m_12 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_2) and (not m_4)): True
type: True
direction: True
origin: True
agent: True

t_before(m_1, m_2): True
t_before: True

t_before(m_2, m_3): True
t_before: True

t_before(m_3, m_4): True
t_before: True

t_before(m_4, m_5): False
t_before: False

t_while(m_5, m_6): False
t_while: False

t_before(m_6, m_7): False
t_before: False

t_while(m_7, m_8): False
t_while: False

t_before(m_8, m_9): False
t_before: False

t_while(m_9, m_10): False
t_while: False

t_before(m_10, m_11): True
t_before: True

t_before(m_11, m_12): True
t_before: True

In this initial animation, the "blinking" of the eye is correct. However, the blue and black circles did not properly align their left and right edges to the white circle.


Correction iteration 1
Verification report of correction iteration 1
o_1 = iota(Object, lambda o: color(o, "white") and shape(o, "circle")): True
color: True
shape: True

o_2 = iota(Object, lambda o: color(o, "blue") and shape(o, "circle")): True
color: True
shape: True

o_3 = iota(Object, lambda o: color(o, "black") and shape(o, "circle")): True
color: True
shape: True

m_1 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and duration(m, 0.6) and agent(m, o_1)): True
type: True
direction: True
magnitude: True
origin: True
duration: True
agent: True

m_2 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1)): True
type: True
direction: True
origin: True
agent: True

m_3 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_1)): True
type: True
direction: True
magnitude: True
origin: True
agent: True

m_4 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_2)): True
type: True
direction: True
origin: True
agent: True

m_5 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_2, o_1)) and agent(m, o_2)): True
type: True
post: True
s_left_border: True
agent: True

m_6 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_3, o_1)) and agent(m, o_3)): False
type: True
post: False
s_left_border: False
agent: True

m_7 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_2, o_1)) and agent(m, o_2)): True
type: True
post: True
s_right_border: True
agent: True

m_8 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_3, o_1)) and agent(m, o_3)): False
type: True
post: False
s_right_border: False
agent: True

m_9 = iota(Motion, lambda m: type(m, "translate") and (not post(m, s_border(o_2, o_1))) and agent(m, o_2) and (not m_5) and (not m_7)): True
type: True
post: True
s_border: True
agent: True

m_10 = iota(Motion, lambda m: type(m, "translate") and (not post(m, s_border(o_3, o_1))) and agent(m, o_3) and (not m_6) and (not m_8)): True
type: True
post: False
s_border: True
agent: True

m_11 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_1) and (not m_3)): True
type: True
direction: True
magnitude: True
origin: True
agent: True

m_12 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_2) and (not m_4)): True
type: True
direction: True
origin: True
agent: True

t_before(m_1, m_2): True
t_before: True

t_before(m_2, m_3): True
t_before: True

t_before(m_3, m_4): True
t_before: True

t_before(m_4, m_5): True
t_before: True

t_while(m_5, m_6): False
t_while: False

t_before(m_6, m_7): False
t_before: False

t_while(m_7, m_8): False
t_while: False

t_before(m_8, m_9): False
t_before: False

t_while(m_9, m_10): True
t_while: True

t_before(m_10, m_11): True
t_before: True

t_before(m_11, m_12): True
t_before: True

In the first correction attempt, the blue circle's movements improved. However, the black circle, instead of aligning its edges to the white circle, moved to the center of the blue circle.


Correction iteration 2
Verification report of correction iteration 2
o_1 = iota(Object, lambda o: color(o, "white") and shape(o, "circle")): True
color: True
shape: True

o_2 = iota(Object, lambda o: color(o, "blue") and shape(o, "circle")): True
color: True
shape: True

o_3 = iota(Object, lambda o: color(o, "black") and shape(o, "circle")): True
color: True
shape: True

m_1 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and duration(m, 0.6) and agent(m, o_1)): True
type: True
direction: True
magnitude: True
origin: True
duration: True
agent: True

m_2 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1)): True
type: True
direction: True
origin: True
agent: True

m_3 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_1)): True
type: True
direction: True
magnitude: True
origin: True
agent: True

m_4 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_2)): True
type: True
direction: True
origin: True
agent: True

m_5 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_2, o_1)) and agent(m, o_2)): True
type: True
post: True
s_left_border: True
agent: True

m_6 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_3, o_1)) and agent(m, o_3)): True
type: True
post: True
s_left_border: True
agent: True

m_7 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_2, o_1)) and agent(m, o_2)): True
type: True
post: True
s_right_border: True
agent: True

m_8 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_3, o_1)) and agent(m, o_3)): True
type: True
post: True
s_right_border: True
agent: True

m_9 = iota(Motion, lambda m: type(m, "translate") and (not post(m, s_border(o_2, o_1))) and agent(m, o_2) and (not m_5) and (not m_7)): False
type: True
post: True
s_border: True
agent: True

m_10 = iota(Motion, lambda m: type(m, "translate") and (not post(m, s_border(o_3, o_1))) and agent(m, o_3) and (not m_6) and (not m_8)): False
type: True
post: True
s_border: True
agent: True

m_11 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_1) and (not m_3)): True
type: True
direction: True
magnitude: True
origin: True
agent: True

m_12 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_2) and (not m_4)): True
type: True
direction: True
origin: True
agent: True

t_before(m_1, m_2): True
t_before: True

t_before(m_2, m_3): True
t_before: True

t_before(m_3, m_4): True
t_before: True

t_before(m_4, m_5): True
t_before: True

t_while(m_5, m_6): True
t_while: True

t_before(m_6, m_7): True
t_before: True

t_while(m_7, m_8): True
t_while: True

t_before(m_8, m_9): False
t_before: False

t_while(m_9, m_10): False
t_while: False

t_before(m_10, m_11): False
t_before: False

t_before(m_11, m_12): True
t_before: True

In this correction iteration, both circles now properly align their edges to the white circle. However, they did not move back to the center of the white circle.


Correction iteration 3
Verification report of correction iteration 3
o_1 = iota(Object, lambda o: color(o, "white") and shape(o, "circle")): True
color: True
shape: True

o_2 = iota(Object, lambda o: color(o, "blue") and shape(o, "circle")): True
color: True
shape: True

o_3 = iota(Object, lambda o: color(o, "black") and shape(o, "circle")): True
color: True
shape: True

m_1 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and duration(m, 0.6) and agent(m, o_1)): True
type: True
direction: True
magnitude: True
origin: True
duration: True
agent: True

m_2 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1)): True
type: True
direction: True
origin: True
agent: True

m_3 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_1)): True
type: True
direction: True
magnitude: True
origin: True
agent: True

m_4 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_2)): True
type: True
direction: True
origin: True
agent: True

m_5 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_2, o_1)) and agent(m, o_2)): True
type: True
post: True
s_left_border: True
agent: True

m_6 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_3, o_1)) and agent(m, o_3)): True
type: True
post: True
s_left_border: True
agent: True

m_7 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_2, o_1)) and agent(m, o_2)): True
type: True
post: True
s_right_border: True
agent: True

m_8 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_3, o_1)) and agent(m, o_3)): True
type: True
post: True
s_right_border: True
agent: True

m_9 = iota(Motion, lambda m: type(m, "translate") and (not post(m, s_border(o_2, o_1))) and agent(m, o_2) and (not m_5) and (not m_7)): False
type: True
post: True
s_border: True
agent: True

m_10 = iota(Motion, lambda m: type(m, "translate") and (not post(m, s_border(o_3, o_1))) and agent(m, o_3) and (not m_6) and (not m_8)): False
type: True
post: True
s_border: True
agent: True

m_11 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_1) and (not m_3)): True
type: True
direction: True
magnitude: True
origin: True
agent: True

m_12 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_2) and (not m_4)): True
type: True
direction: True
origin: True
agent: True

t_before(m_1, m_2): True
t_before: True

t_before(m_2, m_3): True
t_before: True

t_before(m_3, m_4): True
t_before: True

t_before(m_4, m_5): True
t_before: True

t_while(m_5, m_6): True
t_while: True

t_before(m_6, m_7): True
t_before: True

t_while(m_7, m_8): True
t_while: True

t_before(m_8, m_9): False
t_before: False

t_while(m_9, m_10): False
t_while: False

t_before(m_10, m_11): False
t_before: False

t_before(m_11, m_12): True
t_before: True

Here, the same animation is repeated, as sometimes the LLM would get stuck in a fixated state.


Correction iteration 4
Verification report of correction iteration 4
o_1 = iota(Object, lambda o: color(o, "white") and shape(o, "circle")): True
color: True
shape: True

o_2 = iota(Object, lambda o: color(o, "blue") and shape(o, "circle")): True
color: True
shape: True

o_3 = iota(Object, lambda o: color(o, "black") and shape(o, "circle")): True
color: True
shape: True

m_1 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and duration(m, 0.6) and agent(m, o_1)): True
type: True
direction: True
magnitude: True
origin: True
duration: True
agent: True

m_2 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1)): True
type: True
direction: True
origin: True
agent: True

m_3 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_1)): True
type: True
direction: True
magnitude: True
origin: True
agent: True

m_4 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_2)): True
type: True
direction: True
origin: True
agent: True

m_5 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_2, o_1)) and agent(m, o_2)): True
type: True
post: True
s_left_border: True
agent: True

m_6 = iota(Motion, lambda m: type(m, "translate") and post(m, s_left_border(o_3, o_1)) and agent(m, o_3)): True
type: True
post: True
s_left_border: True
agent: True

m_7 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_2, o_1)) and agent(m, o_2)): True
type: True
post: True
s_right_border: True
agent: True

m_8 = iota(Motion, lambda m: type(m, "translate") and post(m, s_right_border(o_3, o_1)) and agent(m, o_3)): True
type: True
post: True
s_right_border: True
agent: True

m_9 = iota(Motion, lambda m: type(m, "translate") and (not post(m, s_border(o_2, o_1))) and agent(m, o_2) and (not m_5) and (not m_7)): True
type: True
post: True
s_border: True
agent: True

m_10 = iota(Motion, lambda m: type(m, "translate") and (not post(m, s_border(o_3, o_1))) and agent(m, o_3) and (not m_6) and (not m_8)): True
type: True
post: True
s_border: True
agent: True

m_11 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, -1.0]) and magnitude(m, [0.0, 0.1]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_1) and (not m_3)): True
type: True
direction: True
magnitude: True
origin: True
agent: True

m_12 = iota(Motion, lambda m: type(m, "scale") and direction(m, [0.0, 1.0]) and origin(m, ["50%", "50%"]) and agent(m, o_1) and (not m_2) and (not m_4)): True
type: True
direction: True
origin: True
agent: True

t_before(m_1, m_2): True
t_before: True

t_before(m_2, m_3): True
t_before: True

t_before(m_3, m_4): True
t_before: True

t_before(m_4, m_5): True
t_before: True

t_while(m_5, m_6): True
t_while: True

t_before(m_6, m_7): True
t_before: True

t_while(m_7, m_8): True
t_while: True

t_before(m_8, m_9): True
t_before: True

t_while(m_9, m_10): True
t_while: True

t_before(m_10, m_11): True
t_before: True

t_before(m_11, m_12): True
t_before: True

Finally, the animation is fully correct after four correction iterations.