diff --git a/.editorconfig b/.editorconfig index 0faa1c175..9633bf902 100644 --- a/.editorconfig +++ b/.editorconfig @@ -152,3 +152,7 @@ indent_size = 0 trim_trailing_whitespace = false insert_final_newline = false end_of_line = lf + +[*.pro] +indent_style = space +indent_size = 0 diff --git a/book.json b/book.json index 839600e50..f851e6744 100644 --- a/book.json +++ b/book.json @@ -185,6 +185,10 @@ "lang": "lolcode", "name": "LOLCODE" }, + { + "lang": "pro", + "name": "Prolog" + }, { "lang": "piet", "name": "Piet" diff --git a/contents/euclidean_algorithm/code/prolog/euclidean_algorithm.pro b/contents/euclidean_algorithm/code/prolog/euclidean_algorithm.pro new file mode 100644 index 000000000..ea8a2e605 --- /dev/null +++ b/contents/euclidean_algorithm/code/prolog/euclidean_algorithm.pro @@ -0,0 +1,12 @@ +euclid_sub(A, A, A) :- !. +euclid_sub(A, B, Result) :- A1 is abs(A), B1 is abs(B), + A1 > B1, !, T is A1 - B1, euclid_sub(T, B1, Result). +euclid_sub(A, B, Result) :- A1 is abs(A), B1 is abs(B), + A1 =< B1, !, T is B1 - A1, euclid_sub(A1, T, Result). + +euclid_mod(A, 0, A) :- !. +euclid_mod(A, B, Result) :- A1 is abs(A), B1 is abs(B), + M is mod(A1, B1), euclid_mod(B1, M, Result). + +test_euclid_sub(Result) :- euclid_sub(4288, 5184, Result). % Result: 64 +test_euclid_mod(Result) :- euclid_mod(1536, 9856, Result). % Result: 128 diff --git a/contents/euclidean_algorithm/euclidean_algorithm.md b/contents/euclidean_algorithm/euclidean_algorithm.md index 967e4b5f9..7d0cb007b 100644 --- a/contents/euclidean_algorithm/euclidean_algorithm.md +++ b/contents/euclidean_algorithm/euclidean_algorithm.md @@ -65,6 +65,8 @@ The algorithm is a simple way to find the *greatest common divisor* (GCD) of two [import:25-40, lang="LOLCODE"](code/lolcode/euclid.lol) {% sample lang="bash" %} [import:24-38, lang="bash"](code/bash/euclid.bash) +{% sample lang="pro" %} +[import:1-5, lang="Prolog"](code/prolog/euclidean_algorithm.pro) {% sample lang="piet" %} > ![](code/piet/subtract/euclidian_algorithm_subtract_large.png) ![](code/piet/subtract/euclidian_algorithm_subtract.png) {% sample lang="ss" %} @@ -140,6 +142,8 @@ Modern implementations, though, often use the modulus operator (%) like so [import:9-23, lang="LOLCODE"](code/lolcode/euclid.lol) {% sample lang="bash" %} [import:10-22, lang="bash"](code/bash/euclid.bash) +{% sample lang="pro" %} +[import:7-10, lang="Prolog"](code/prolog/euclidean_algorithm.pro) {% sample lang="piet" %} > ![](code/piet/mod/euclidian_algorithm_mod_large.png) ![](code/piet/mod/euclidian_algorithm_mod.png) {% sample lang="ss" %} @@ -229,6 +233,8 @@ and modulo method: [import, lang="LOLCODE"](code/lolcode/euclid.lol) {% sample lang="bash" %} [import, lang="bash"](code/bash/euclid.bash) +{% sample lang="pro" %} +[import, lang="Prolog"](code/prolog/euclidean_algorithm.pro) {% sample lang="piet" %} A text version of the program is provided for both versions. #### Subtraction