(** * Definitions *)
Definition symbol := nat.
Definition string := (string nat).
Definition card : Type := (card nat).
Definition stack := stack nat.
Notation "x / y" := (x,y).
Implicit Types a b : symbol.
Implicit Types x y z : string.
Implicit Types d e : card.
Implicit Types A R P : stack.
Coercion sing (n : nat) := [n].
(** ** Post Correspondence Problem *)

(* Specifications: *)
Lemma tau1_app A B : tau1 (A ++ B) = tau1 A ++ tau1 B.
Lemma tau2_app A B : tau2 (A ++ B) = tau2 A ++ tau2 B.
Definition cards x := map (fun a => [a] / [a]) x.
Lemma tau1_cards x : tau1 (cards x) = x.
Lemma tau2_cards x : tau2 (cards x) = x.
Hint Rewrite tau1_app tau2_app tau1_cards tau2_cards : list.