Generating Good Generators for Inductive Relations POPL 2018 Leonidas Lampropoulos 1 Zoe Paraskevopoulou 2 Benjamin Pierce 1 1 University of Pennsylvania 2 Princeton University
Generating Good Generators for Inductive Relations in a property-based random testing tool for Coq 1 / 21
����������� ��� � � � ��� Testing with QuickChick ∀ ( x : A ) . P ( x ) More confidence! ✓ P ( a )? ✗ Counterexample! 2 / 21
����������� ��� � � � ��� Testing with QuickChick ∀ ( x : A ) .Q ( x ) ⇒ P ( x ) More confidence! ✓ ✓ Q ( a )? P ( a )? ✗ Counterexample! ✗ 3 / 21
����� � Sparse Preconditions Q 4 / 21
����� ����������������� � �� �� �� � �� ����� � ����������� ∀ ��� �� � ����� �� � ������ �� �� �� � � → �� ���� �� → • Random data generator for ���� • Type inference function • � ���� �� as a function • Decidability for � �� � � � 5 / 21
����� ����������������� � �� �� �� � �� ����� � ����������� ��� ���� ��� ������ ���� �� ����� ���������� ����� ∀ ��� �� � ����� �� � ������ �� �� �� � � → �� ���� �� → More confidence? 6 / 21
� � � � � �� � � � � � �� �� � λ � ( N → N ) → N .x 6 � λ � N ��� � �� λ � N ��� �� � λ � N ����� � � λ � ( N → N ) → N ��� � λ � N ��� λ � N �� λ � N �� � λ � ( N → N ) → ( N → N ) �� λ � N �� �� λ � N ��� � λ � N ���� λ � N → N � λ � N �� λ � N → N �� �� �� � λ � N ��� � λ � N �� λ � N �� λ � N → N ���� 7 / 21
� � � � � �� � � � � � �� �� � λ � ( N → N ) → N .x 6 � λ � N ��� � �� λ � N ��� �� � λ � N ����� � � λ � ( N → N ) → N ��� � λ � N ��� λ � N �� λ � N �� � λ � ( N → N ) → ( N → N ) �� λ � N �� �� λ � N ��� � λ � N ���� λ � N → N � λ � N �� λ � N → N �� �� �� � λ � N ��� � λ � N �� λ � N �� λ � N → N ���� 7 / 21
����������� ��� � � � Testing with Good Generators ∀ ( x : A ) .Q ( x ) ⇒ P ( x ) More confidence! ✓ ��� such that Q ( � ) P ( a )? Counterexample! ✗ 8 / 21
����� � Counterexample Q 9 / 21
�������� ∀ ( x : A ) .Q ( x ) ⇒ P ( x ) ����� � is good if Soundness x ∈ range ( gen ) ⇒ Q ( x ) and Completeness x ∈ Q ( x ) ⇒ range ( gen ) 10 / 21
Generate only well-typed terms! �������� � ��� → ���� → � ���� such that e ∈ range ( gen _ term Γ t ) ⇒ Γ ⊢ e : t Make sure that all of them can be generated! Γ ⊢ e : t ⇒ e ∈ range ( gen _ term Γ t ) 11 / 21
� ����� � � �� ��������� ���� � �������� �� ����� ����� ���� ���� ��������� ����� ���� ���� ���� ��� ����� ��� ���� ��������� ����� ��� ����� ����� ��������� ����� � � �� ��������� ���� � ����� � � �� ��������� ���� ��������� ����� ���� �� ������ ��� ����� ��� ���� ��������� ����� ��� ����� ���� ��������� � � �� � ����� ���� ���� �� �������� ������� ����� � ���� ���� � ���� ����� ����� ����� � � ������� ����� := ���� ���� � ← ����� ���� � � ��� �� ��� � ��� ����� � � �� ��� � ← ���������� ��������� ����� ���� ��� ���� ���� � ← ����� ���� � � ��� �� ��� � ��� ����� Testing an Optimising Compiler by Generating Random Lambda Terms. Michal H. Palka, Koen Claessen, Alejandro Russo, and John Hughes. AST ’11 � � �� ��� � ← ���������� ��������� ����� ���� ��� ��� ����� ��� ���� ���� �� ← ������� ����� ����� �� ���� ����� ��� ��� ���� ← ���������� ���� �� ← ������� ����� ��� ������ ���� ����� ���� �� ← ������� ����� ��� ����� 12 / 21
� ����� � � �� ��������� ���� � �������� �� ����� ����� ���� ���� ��������� ����� ���� ���� ���� ��� ����� ��� ���� ��������� ����� ��� ����� ����� ��������� ����� � � �� ��������� ���� � ����� � � �� ��������� ���� ��������� ����� ���� �� ������ ��� ����� ��� ���� ��������� ����� ��� ����� ���� ��������� � � �� � ����� ���� ���� �� �������� ������� ����� � ���� ���� � ���� ����� ����� ����� � � ������� ����� := ���� ���� � ← ����� ���� � � ��� �� ��� � ��� ����� � � �� ��� � ← ���������� ��������� ����� ���� ��� ���� ���� � ← ����� ���� � � ��� �� ��� � ��� ����� Testing an Optimising Compiler by Generating Random Lambda Terms. Michal H. Palka, Koen Claessen, Alejandro Russo, and John Hughes. AST ’11 � � �� ��� � ← ���������� ��������� ����� ���� ��� ��� ����� ��� ���� ���� �� ← ������� ����� ����� �� ���� ����� ��� ��� ���� ← ���������� ���� �� ← ������� ����� ��� ������ ���� ����� ���� �� ← ������� ����� ��� ����� 12 / 21
Generating Good Generators ��������� ��� 1 → � 2 → ���� ����� 2 � � 1 → ����� and ∀ a 1 , range ( gen _ A 2 a 1 ) ≡ { a 2 | Q a 1 a 2 } 13 / 21
Generating Good Generators ��������� ��������� ��� → ���� → ���� → ���� ��������� ��� → ���� → ����� 14 / 21
��������� � ��� � ����� � ���� � � �� ��� ���� � ����� �� �� �� ���� � �������� ��� �� � ��� ��� ����� ���� �� ��� ��� � ��� �� �������� �������� � à � ���� �� � ����� � � ������� ����� := 15 / 21
��������� � ��� � ����� � ���� � � �� ��� ���� � ����� �� �� �� ���� � �������� ��� �� � ��� ��� ����� ���� �� ��� ��� � ��� �� �������� �������� � Γ � ���� �� � ����� � � ������� ����� := � ���� � ∀ Γ � �� ��� ��� �� Γ � �� � � �� → Γ �� ���� �� �� � ����� �� �� 15 / 21
Recommend
More recommend