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. 如何比較兩個非ASCII字符串
- 2. 如何比較兩個w_char []字符串
- 3. 如何比較兩個字符串
- 4. 如何比較兩個Q字符串?
- 5. Javascript如何比較兩個字符串
- 6. 如何比較兩個字符串?
- 7. 如何比較兩個base64字符串?
- 8. 比較兩個字符串[]
- 9. 比較兩個字符串?
- 10. 比較兩個字符串
- 11. 如何比較字符串中的兩個字符?
- 12. 比較ruby中的兩個字符串
- 13. 比較C++中的兩個字符串
- 14. 比較ArrayList中的兩個字符串
- 15. 比較兩個字符串中的Java
- 16. 比較C#中的兩個字符串
- 17. 比較MIPS中的兩個字符串
- 18. 比較bash中的兩個字符串
- 19. 比較ANT中的兩個字符串
- 20. 比較兩個字符串中的值
- 21. 比較C++中的兩個字符串
- 22. 比較python中的兩個字符串?
- 23. 逐字比較.NET中兩個字符串的比較
- 24. 比較兩個字符串,如日期
- 25. 在python中比較兩個字符串
- 26. 在freemarker中比較兩個字符串
- 27. 在java中比較兩個字符串
- 28. 如何比較兩個分隔字符串中的每個值?
- 29. C++比較兩個字符串文字
- 30. 比較兩個數字字符串值
這很有趣。我設法使'string_eq_dec'的運行時間比標準時間縮短了3倍。布爾版本的性能仍然超過該版本的3倍(約)。 –
它會一直這樣做,特別是如果證明必須使用某種形式的區分...我想真正的相分離在這裏會有所幫助,但要實現我聽到的並不是那麼容易,因爲這種類似......你不是專家。 – ejgallego
請注意,您可以使用'Scheme Equality for string.'自動生成布爾相等函數。 –