2
A
回答
3
您可以使用string_dec
函数,该函数决定(因此后缀_dec
)两个字符串是否相等。顺便说一下,这个名字略微违反了通常的Coq命名风格 - 它应该被命名为string_eq_dec
- _eq_dec
代表可判定的等式。 string_dec
具有以下类型:
string_dec
: forall s1 s2 : string, {s1 = s2} + {s1 <> s2}
让我提供一个具体的例子。勒柯克让您在if
-expressions使用string_dec
像普通的布尔值:
Require Import String.
Open Scope string_scope.
Coq < Compute if string_dec "abc" "abc" then 1 else 0.
= 1
: nat
Coq < Compute if string_dec "ABC" "abc" then 1 else 0.
= 0
: nat
2
如果你要进去勒柯克实际运行字符串比较,我建议使用布尔版本:
From Coq Require Import Bool Ascii String.
Definition eq_ascii (a1 a2 : ascii) :=
match a1, a2 with
| Ascii b1 b2 b3 b4 b5 b6 b7 b8, Ascii c1 c2 c3 c4 c5 c6 c7 c8 =>
(eqb b1 c1) && (eqb b2 c2) && (eqb b3 c3) && (eqb b4 c4) &&
(eqb b5 c5) && (eqb b6 c6) && (eqb b7 c7) && (eqb b8 c8)
end.
Fixpoint eq_string (s1 s2 : string) :=
match s1, s2 with
| EmptyString, EmptyString => true
| String x1 s1, String x2 s2 => eq_ascii x1 x2 && eq_string s1 s2
| _, _ => false
end.
他们在我的测试中通常快3倍,但如果涉及hnf
策略(这可能在样张中),则可能是一个数量级。
Time Compute if string_dec
"Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
"
"Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
" then 1 else 0.
(* around 0.015 *)
Time Compute eq_string
"Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
"
"Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
Hola como te llamas amigo? Hola como te llamas amigo? Hola como te llamas amigo?
".
(* around 0.005 *)
相关问题
- 1. 如何比较两个w_char []字符串
- 2. Javascript如何比较两个字符串
- 3. 如何比较两个字符串?
- 4. 如何比较两个字符串
- 5. 比较两个字符串[]
- 6. 比较两个字符串
- 7. 比较两个字符串?
- 8. 比较ArrayList中的两个字符串
- 9. 比较ANT中的两个字符串
- 10. 比较C++中的两个字符串
- 11. 比较C#中的两个字符串
- 12. 逐字比较.NET中两个字符串的比较
- 13. 在java中比较两个字符串
- 14. 如何比较两个分隔字符串中的每个值?
- 15. 比较Android上的两个字符串
- 16. 比较两个字符串的ArrayList
- 17. 比较两个字符串的含义
- 18. 在字符比较两个字符串中的字符
- 19. 比较两组字符串
- 20. 比较字符串两场
- 21. 如何在java中比较两个数字字符串
- 22. 如何在Coq中比较两个'int'类型的命题?
- 23. 如何比较django中模板上的两个字符串?
- 24. 如何比较javascript中的两个字符串日期?
- 25. 如何比较mongoDB弹簧数据中的两个字符串?
- 26. 如何比较Objective-C中的两个字符串
- 27. 如何比较scala中的两个字符串?
- 28. 如何比较Java中的两个版本字符串?
- 29. 如何比较python中两个相似的句子字符串?
- 30. 如何比较两个字符串在php中的相等性?
这很有趣。我设法使'string_eq_dec'的运行时间比标准时间缩短了3倍。布尔版本的性能仍然超过该版本的3倍(约)。 –
它会一直这样做,特别是如果证明必须使用某种形式的区分...我想真正的相分离在这里会有所帮助,但要实现我听到的并不是那么容易,因为这种类似......你不是专家。 – ejgallego
请注意,您可以使用'Scheme Equality for string.'自动生成布尔相等函数。 –