التسوية المنطقية للقوائم في Coq؟

أريد أن أكون قادرًا على مقارنة عنصرين من النوع "list" في Coq والحصول على منطقي "true" أو "false" لتكافئهما.

الآن ، أقوم بمقارنة القائمتين بهذه الطريقة:

Eval vm_compute in (list 1 = list 2). 

أحصل على دعامة من النموذج:

= nil
   :: (2 :: 3 :: nil)
      :: (2 :: nil)
         :: (3 :: nil) :: nil =
   nil
   :: (2 :: 3 :: nil)
      :: (2 :: nil)
         :: (3 :: nil) :: nil
 : Prop

من الواضح أن list1 = list2 ، فكيف يمكنني الحصول عليه فقط لإرجاع صح أو خطأ؟

0
لاحظ أن = تقوم بإرجاع Prop ، وهو ليس الشيء نفسه كمعنى منطقي. توضح هذه الإجابة المشكلة بمزيد من التفصيل.
وأضاف المؤلف Arthur Azevedo De Amorim, مصدر
هل قمت بالتعريف الخاص بك list ؟ عادة ما يكون منشئ نوع ، بحيث list nat هو نوع من قوائم الأرقام. ولكن يبدو أنك تستخدمه كمنشئ (قيمة) ، وإنشاء قائمة محددة ، لذلك يجب أن تكون قد قمت بطهي شيء خاص بك ، أليس كذلك؟
وأضاف المؤلف larsr, مصدر

2 إجابة

أستخدم عوامل المساواة المنطقية بمكتبة العمليات الرياضية :

From mathcomp Require Import all_ssreflect.

...

Eval vm_compute in list 1 == list 2
0
وأضاف

يمكنك إنشاء دالة مساوية قائمة منطقية تأخذ كمدخل قيمة منطقية على العناصر تلقائيًا باستخدام أوامر Coq:

Require Import Coq.Lists.List Coq.Bool.Bool.

Import Coq.Lists.List.ListNotations.

Scheme Equality for list.

هذا يطبع:

list_beq is defined
list_eq_dec is defined

حيث list_beq هي دالة مساواة منطقية في القوائم التي تأخذ كمعامل أول دالة مقارنة لعناصر القوائم ثم قائمتين:

Print list_beq.

يعطي

list_beq = 
fun (A : Type) (eq_A : A -> A -> bool) =>
fix list_eqrec (X Y : list A) {struct X} : bool :=
  match X with
  | [] => match Y with
          | [] => true
          | _ :: _ => false
          end
  | x :: x0 => match Y with
               | [] => false
               | x1 :: x2 => eq_A x x1 && list_eqrec x0 x2
               end
  end
     : forall A : Type, (A -> A -> bool) -> list A -> list A -> bool

و

Check list_eq_dec

يعطي

list_eq_dec
     : forall (A : Type) (eq_A : A -> A -> bool),
       (forall x y : A, eq_A x y = true -> x = y) ->
       (forall x y : A, x = y -> eq_A x y = true) -> forall x y : list A, {x =  y} + {x <> y}

تبين أن المساواة في القائمة هي قابلة للعمالة إذا كانت المساواة الكامنة في المساواة متفقة مع مبدأ المساواة الليبية.

0
وأضاف
لاحظ أنه يمكنك الحصول على Coq لإنشاء معظم هذا لك عن طريق كتابة مساواة المخطط للقائمة.
وأضاف المؤلف Jason Gross, مصدر
شكر. لم أكن أعلم عن مساواة النظام . سوف أقوم بتحديث إجابتي وفقًا لذلك.
وأضاف المؤلف nesreka, مصدر