Skip to content
Snippets Groups Projects
Euclids_Algorithm.mp 4.64 KiB
/*┬────────────────────────────────────────────────────────┐
│*│ ┌─[ Title and Authors ]──────────────────────────────┐ │
│*│ │ Model of Euclids Algorithm                         │ │
│*│ │  Created by Michael Collins in October, 2022.      │ │
│*│ │  Edited by Pamela Dyer and Kristin Giammarco in    │ │
│*│ │   October, 2022.                                   │ │
│*│ └────────────────────────────────────────────────────┘ │
│*│                                                        │
│*│ ┌─[ Purpose ]────────────────────────────────────────┐ │
│*│ │ To use MP to model an adaptation of the well-known │ │
│*│ │ Greatest Common Divisor (GCD) Algorithm by Euclid. │ │
│*│ └────────────────────────────────────────────────────┘ │
│*│                                                        │
│*│ ┌─[ Description ]────────────────────────────────────┐ │
│*│ │ This models Euclid's algorithm to compute a GCD    | |
│*│ │ Inspired by Leslie Lamports discussions about TLA+ │ │
|*| | The constraints handle undesirable traces in such a| | 
|*| | computation.                                       | |
│*│ └────────────────────────────────────────────────────┘ │
│*│                                                        │
│*│ ┌─[ References ]─────────────────────────────────────┐ │
│*│ │ Leslie Lamport's Introduction to TLA+              | |
│*│ │ https://www.newsroom.hlf-foundation.org/newsroom/  | |
│*│ │ https://www.newsroom.hlf-foundation.org/newsroom/lectures/video/lecture-if-youre-not-writing-a-program-dont-use-a-programming-language.html
│*│ └────────────────────────────────────────────────────┘ │
│*│                                                        │
│*│ ┌─[ Search Terms ]───────────────────────────────────┐ │
│*│ │ behavior, Euclid; GCD; Lamport;                    │ │
│*│ │ coordination, event; ENSURE, conditional           │ │
│*│ └────────────────────────────────────────────────────┘ │
│*│                                                        │
│*│ ┌─[ Instructions ]───────────────────────────────────┐ │
│*│ │ Run for Scopes 1, 2, and 3.                        │ │
│*│ ├─[ Run Statistics ]─────────────────────────────────┤ │
│*│ │ Scope 1:  4 traces in less than 1 sec.             │ │
│*│ │ Scope 2: 10 traces in less than 1 sec.             │ │
│*│ │ Scope 3: 22 traces in less than 1 sec.             │ │
│*│ └────────────────────────────────────────────────────┘ │
└*┴───────────────────────────────────────────────────────*/

SCHEMA Euclids_Algorithm

ROOT GCD:   set_initial_value_for_x
            set_initial_Value_for_y

			(*
    			(  	x_has_become_greater_than_y
       				x_is_assigned_new_value_of_y_subtracted_from_x
       				y_does_not_change_value
    			|
       				y_has_become_greater_than_x
       				y_is_assigned_new_value_of_x_subtracted_from_y
       				x_does_not_change_value
    			|  
       				x_equals_y
    			)
			*)
;

IF #x_equals_y > 0 THEN

 ENSURE #x_equals_y == 1;
 ENSURE FOREACH $x: x_equals_y

   #x_has_become_greater_than_y AFTER $x == 0 AND

   #y_has_become_greater_than_x AFTER $x == 0;

FI;