-
Notifications
You must be signed in to change notification settings - Fork 5
Open
Description
I am trying to use Coq-of-Python to translate a very basic python program into coq.
from typing import List
def has_close_elements(numbers: List[float], threshold: float) -> bool:
"""Check if in given list of numbers, are any two numbers closer to each other than given threshold"""
for idx, elem in enumerate(numbers):
for idx2, elem2 in enumerate(numbers):
if idx != idx2:
distance = abs(elem - elem2)
if distance < threshold:
return True
return False
However, I am having trouble verifying if the resulting coq code is a faithful translation of the original Python. I am struggling to get unit tests to check the behavior of the new Coq code working.
assert candidate([1.0, 2.0, 3.9, 4.0, 5.0, 2.2], 0.3) == True
Coq-of-Python wants to translate assert statements into:
Definition check : Value.t -> Value.t -> M :=
fun (args kwargs : Value.t) =>
let- locals_stack := M.create_locals locals_stack args kwargs [ "has_close_elements" ] in
ltac:(M.monadic (
let _ := M.assert (| Compare.eq (|
M.call (|
M.get_name (| globals, locals_stack, "has_close_elements" |),
make_list [
make_list [
Constant.float "1.0";
Constant.float "2.0";
Constant.float "3.9";
Constant.float "4.0";
Constant.float "5.0";
Constant.float "2.2"
];
Constant.float "0.3"
],
make_dict []
|),
Constant.bool true
|) |)
However, this compiles regardless of if the Constant.bool that it is being compared against is true or false.
I am wondering how one is supposed to verify that the resulting coq program has the correct behavior?
Metadata
Metadata
Assignees
Labels
No labels