Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SPARSE

Stands for Symbolic logic PARSEr. This is a program that leverages python lambda functions to parse and perform basic tasks with symbolic logic.

Using SPARSE

SPARSE is a command line program executed by typing python3 sparsein the sparse directory. You can also double click the sparse file on a Windows machine if you have it so configured. You can also use the --verbose and --devmode command line arguments to add more description of what SPARSE is up to if you would like.

If you do not have git installed on your machine, you can dowload and extract the zip files from this webpage.

I hate it when software vendors demonize their customers and prevent good use of their software through excessive fees and usage contracts, but I also recognize and share the desire to profit off of one's hard work. In that spirit, I provide this software free of charge and free to distribute, but I ask that you keep this message attached. I am also providing a link to my venmo account below. If you use this program and think it has given you value, I would be grateful if you would pay me for that value. Thanks!

Syntax

The sparse syntax is very basic and can be summed up in the following way:

Basic symbols:

  • ^ -> boolean AND
  • v -> boolean OR
  • ! -> boolean NOT

Function definition

Functions are defined by typing the function name and then the function definition using logic symbols. An example would be G = (p^q), where G is defined as boolean (p and q). You can also compose functions with one another to create larger functions. For example, using the previous function G, you could make another function H where H = !G, which would define H as boolean !(p^q). It is important to note when combining functions that the variables from the sub-function are reused directly. For example, if I define A = p and B = A^!p, the resulting function would be defined as B = p^!p, because it inherited the p variable from the function A. Also, it is extremely important to ensure that you do not attempt to use the arguments T,F,t or f in your functions or as function names because these are reserved for inputs to functions and are mapped to true false values directly. Here are some example function definitions:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> xor = (pvq)^!(p^q)
sparse> table xor
+-----+--------------------+
| p,q | (xor) (pvq)^!(p^q) |
+-----+--------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+--------------------+

Comparing functions

You can compare logical functions with the == operator. typing f1 == f2 in the sparse terminal will print True if the functions are logically equivalent (if their truth tables are equal) and False if not. You can also compare several functions at once, but if any of the comparisons are false, the entire statement will evaluate to false. Here are some examples of function comparison:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> p == p
True
sparse> p == q
True
sparse> p == !p
False
sparse> (pvq) == !(!p^!q)
True
sparse> (pvq) == !(!p^!q) == (p^q)
False
sparse> (pvq) == !(!p^!q) == !!(pvq)
True

As you can see here, the arguments are intrinsic to each term in the comparison: the sparse interpreter defines a new logical function for each term. This is why p == q is True; their truth tables are equivalent and the names of the arguments used (p in function 1 and q in function 2) don't impact their truth tables. Here are the truth tables for these functions generated by the sparse table command:

sparse> table p
+---+----------+
| p | (anon) p |
+---+----------+
| F | False |
| T | True |
+---+----------+
sparse> table q
+---+----------+
| q | (anon) q |
+---+----------+
| F | False |
| T | True |
+---+----------+

It's clear from this that they are equal even though the names of the arguments are different.

Evaluating functions at given truth values

You can evaluate sparse functions with the { and } operators. These allow you to feed sparse specific arguments for the function to use when it runs. You can use 0, 1, T, F, t, or f as arguments. Here is an example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> nand{0,0}
True
sparse> nand{0,1}
True
sparse> nand{1,1}
False
sparse> nand{F,F}
True
sparse> nand{F,T}
True
sparse> nand{T,T}
False
sparse> nand{T,t}
False
sparse> nand{T,1}
False
sparse> nand{T,0}
True
sparse> nand{f,t}
True

Composing functions

SPARSE has a powerful mechanism for defining new functions based off of other predefined functions. You can again use the { and } operators to feed functions different variable names as arguments, or even different functions as arguments. Let's say you want to see what the truth table for this function is: p -> q or q -> p. Here's how you would go about that in sparse:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> func = ->{p,q} v ->{q,p}
sparse> print func
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- func ->{p,q} v ->{q,p} ( !pvq) v ( !qvp) f = lambda p,q: ( not p or q) or ( not q or p) sparse> table func
+-----+--------------------------+
| p,q | (func) ->{p,q} v ->{q,p} |
+-----+--------------------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------+

Now let's say you want to define an or function from only nand functions. Here's how you could do that:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> or = nand{nand{p,p},nand{q,q}}
sparse> table or
+-----+--------------------------------+
| p,q | (or) nand{nand{p,p},nand{q,q}} |
+-----+--------------------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------------+

This same idea can be used for pretty much any function composition you want. You can even compose functions with fixed values as one of their arguments. For example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> alwaysTrue = ->{f,p}
sparse> print alwaysTrue
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- alwaysTrue ->{f,p} ( !fvp) f = lambda p: ( not False or p) sparse> table alwaysTrue
+---+----------------------+
| p | (alwaysTrue) ->{f,p} |
+---+----------------------+
| F | True |
| T | True |
+---+----------------------+

In this example, alwaysTrue is defined as False -> p and takes one argument, p. This is always true, which the truth table of alwaysTrue reflects.

WARNING: Function composition is the part of SPARSE I am least confident in. If you find a bug, see message at the bottom of this readme.

Basic commands

Typing help in the sparse terminal will list commands, what they do, and how to use them.

Support

If you have new feature requests or bug reports, feel free to create an issue on the github page and/or email me at xtremesoftwaredev@gmail.com. For the time being I am actively supporting this project. If this ever changes I will change this message to let you know.

you are free to copy the cone from this project and make edits yourself, but this repo is a push mirror of a private repo of mine, so external edits made here will not stick around.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SPARSE

Stands for Symbolic logic PARSEr. This is a program that leverages python lambda functions to parse and perform basic tasks with symbolic logic.

Using SPARSE

SPARSE is a command line program executed by typing python3 sparsein the sparse directory. You can also double click the sparse file on a Windows machine if you have it so configured. You can also use the --verbose and --devmode command line arguments to add more description of what SPARSE is up to if you would like.

If you do not have git installed on your machine, you can dowload and extract the zip files from this webpage.

I hate it when software vendors demonize their customers and prevent good use of their software through excessive fees and usage contracts, but I also recognize and share the desire to profit off of one's hard work. In that spirit, I provide this software free of charge and free to distribute, but I ask that you keep this message attached. I am also providing a link to my venmo account below. If you use this program and think it has given you value, I would be grateful if you would pay me for that value. Thanks!

Syntax

The sparse syntax is very basic and can be summed up in the following way:

Basic symbols:

  • ^ -> boolean AND
  • v -> boolean OR
  • ! -> boolean NOT

Function definition

Functions are defined by typing the function name and then the function definition using logic symbols. An example would be G = (p^q), where G is defined as boolean (p and q). You can also compose functions with one another to create larger functions. For example, using the previous function G, you could make another function H where H = !G, which would define H as boolean !(p^q). It is important to note when combining functions that the variables from the sub-function are reused directly. For example, if I define A = p and B = A^!p, the resulting function would be defined as B = p^!p, because it inherited the p variable from the function A. Also, it is extremely important to ensure that you do not attempt to use the arguments T,F,t or f in your functions or as function names because these are reserved for inputs to functions and are mapped to true false values directly. Here are some example function definitions:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> xor = (pvq)^!(p^q)
sparse> table xor
+-----+--------------------+
| p,q | (xor) (pvq)^!(p^q) |
+-----+--------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+--------------------+

Comparing functions

You can compare logical functions with the == operator. typing f1 == f2 in the sparse terminal will print True if the functions are logically equivalent (if their truth tables are equal) and False if not. You can also compare several functions at once, but if any of the comparisons are false, the entire statement will evaluate to false. Here are some examples of function comparison:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> p == p
True
sparse> p == q
True
sparse> p == !p
False
sparse> (pvq) == !(!p^!q)
True
sparse> (pvq) == !(!p^!q) == (p^q)
False
sparse> (pvq) == !(!p^!q) == !!(pvq)
True

As you can see here, the arguments are intrinsic to each term in the comparison: the sparse interpreter defines a new logical function for each term. This is why p == q is True; their truth tables are equivalent and the names of the arguments used (p in function 1 and q in function 2) don't impact their truth tables. Here are the truth tables for these functions generated by the sparse table command:

sparse> table p
+---+----------+
| p | (anon) p |
+---+----------+
| F | False |
| T | True |
+---+----------+
sparse> table q
+---+----------+
| q | (anon) q |
+---+----------+
| F | False |
| T | True |
+---+----------+

It's clear from this that they are equal even though the names of the arguments are different.

Evaluating functions at given truth values

You can evaluate sparse functions with the { and } operators. These allow you to feed sparse specific arguments for the function to use when it runs. You can use 0, 1, T, F, t, or f as arguments. Here is an example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> nand{0,0}
True
sparse> nand{0,1}
True
sparse> nand{1,1}
False
sparse> nand{F,F}
True
sparse> nand{F,T}
True
sparse> nand{T,T}
False
sparse> nand{T,t}
False
sparse> nand{T,1}
False
sparse> nand{T,0}
True
sparse> nand{f,t}
True

Composing functions

SPARSE has a powerful mechanism for defining new functions based off of other predefined functions. You can again use the { and } operators to feed functions different variable names as arguments, or even different functions as arguments. Let's say you want to see what the truth table for this function is: p -> q or q -> p. Here's how you would go about that in sparse:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> func = ->{p,q} v ->{q,p}
sparse> print func
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- func ->{p,q} v ->{q,p} ( !pvq) v ( !qvp) f = lambda p,q: ( not p or q) or ( not q or p) sparse> table func
+-----+--------------------------+
| p,q | (func) ->{p,q} v ->{q,p} |
+-----+--------------------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------+

Now let's say you want to define an or function from only nand functions. Here's how you could do that:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> or = nand{nand{p,p},nand{q,q}}
sparse> table or
+-----+--------------------------------+
| p,q | (or) nand{nand{p,p},nand{q,q}} |
+-----+--------------------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------------+

This same idea can be used for pretty much any function composition you want. You can even compose functions with fixed values as one of their arguments. For example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> alwaysTrue = ->{f,p}
sparse> print alwaysTrue
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- alwaysTrue ->{f,p} ( !fvp) f = lambda p: ( not False or p) sparse> table alwaysTrue
+---+----------------------+
| p | (alwaysTrue) ->{f,p} |
+---+----------------------+
| F | True |
| T | True |
+---+----------------------+

In this example, alwaysTrue is defined as False -> p and takes one argument, p. This is always true, which the truth table of alwaysTrue reflects.

WARNING: Function composition is the part of SPARSE I am least confident in. If you find a bug, see message at the bottom of this readme.

Basic commands

Typing help in the sparse terminal will list commands, what they do, and how to use them.

Support

If you have new feature requests or bug reports, feel free to create an issue on the github page and/or email me at xtremesoftwaredev@gmail.com. For the time being I am actively supporting this project. If this ever changes I will change this message to let you know.

you are free to copy the cone from this project and make edits yourself, but this repo is a push mirror of a private repo of mine, so external edits made here will not stick around.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SPARSE

Stands for Symbolic logic PARSEr. This is a program that leverages python lambda functions to parse and perform basic tasks with symbolic logic.

Using SPARSE

SPARSE is a command line program executed by typing python3 sparsein the sparse directory. You can also double click the sparse file on a Windows machine if you have it so configured. You can also use the --verbose and --devmode command line arguments to add more description of what SPARSE is up to if you would like.

If you do not have git installed on your machine, you can dowload and extract the zip files from this webpage.

I hate it when software vendors demonize their customers and prevent good use of their software through excessive fees and usage contracts, but I also recognize and share the desire to profit off of one's hard work. In that spirit, I provide this software free of charge and free to distribute, but I ask that you keep this message attached. I am also providing a link to my venmo account below. If you use this program and think it has given you value, I would be grateful if you would pay me for that value. Thanks!

Syntax

The sparse syntax is very basic and can be summed up in the following way:

Basic symbols:

  • ^ -> boolean AND
  • v -> boolean OR
  • ! -> boolean NOT

Function definition

Functions are defined by typing the function name and then the function definition using logic symbols. An example would be G = (p^q), where G is defined as boolean (p and q). You can also compose functions with one another to create larger functions. For example, using the previous function G, you could make another function H where H = !G, which would define H as boolean !(p^q). It is important to note when combining functions that the variables from the sub-function are reused directly. For example, if I define A = p and B = A^!p, the resulting function would be defined as B = p^!p, because it inherited the p variable from the function A. Also, it is extremely important to ensure that you do not attempt to use the arguments T,F,t or f in your functions or as function names because these are reserved for inputs to functions and are mapped to true false values directly. Here are some example function definitions:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> xor = (pvq)^!(p^q)
sparse> table xor
+-----+--------------------+
| p,q | (xor) (pvq)^!(p^q) |
+-----+--------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+--------------------+

Comparing functions

You can compare logical functions with the == operator. typing f1 == f2 in the sparse terminal will print True if the functions are logically equivalent (if their truth tables are equal) and False if not. You can also compare several functions at once, but if any of the comparisons are false, the entire statement will evaluate to false. Here are some examples of function comparison:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> p == p
True
sparse> p == q
True
sparse> p == !p
False
sparse> (pvq) == !(!p^!q)
True
sparse> (pvq) == !(!p^!q) == (p^q)
False
sparse> (pvq) == !(!p^!q) == !!(pvq)
True

As you can see here, the arguments are intrinsic to each term in the comparison: the sparse interpreter defines a new logical function for each term. This is why p == q is True; their truth tables are equivalent and the names of the arguments used (p in function 1 and q in function 2) don't impact their truth tables. Here are the truth tables for these functions generated by the sparse table command:

sparse> table p
+---+----------+
| p | (anon) p |
+---+----------+
| F | False |
| T | True |
+---+----------+
sparse> table q
+---+----------+
| q | (anon) q |
+---+----------+
| F | False |
| T | True |
+---+----------+

It's clear from this that they are equal even though the names of the arguments are different.

Evaluating functions at given truth values

You can evaluate sparse functions with the { and } operators. These allow you to feed sparse specific arguments for the function to use when it runs. You can use 0, 1, T, F, t, or f as arguments. Here is an example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> nand{0,0}
True
sparse> nand{0,1}
True
sparse> nand{1,1}
False
sparse> nand{F,F}
True
sparse> nand{F,T}
True
sparse> nand{T,T}
False
sparse> nand{T,t}
False
sparse> nand{T,1}
False
sparse> nand{T,0}
True
sparse> nand{f,t}
True

Composing functions

SPARSE has a powerful mechanism for defining new functions based off of other predefined functions. You can again use the { and } operators to feed functions different variable names as arguments, or even different functions as arguments. Let's say you want to see what the truth table for this function is: p -> q or q -> p. Here's how you would go about that in sparse:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> func = ->{p,q} v ->{q,p}
sparse> print func
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- func ->{p,q} v ->{q,p} ( !pvq) v ( !qvp) f = lambda p,q: ( not p or q) or ( not q or p) sparse> table func
+-----+--------------------------+
| p,q | (func) ->{p,q} v ->{q,p} |
+-----+--------------------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------+

Now let's say you want to define an or function from only nand functions. Here's how you could do that:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> or = nand{nand{p,p},nand{q,q}}
sparse> table or
+-----+--------------------------------+
| p,q | (or) nand{nand{p,p},nand{q,q}} |
+-----+--------------------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------------+

This same idea can be used for pretty much any function composition you want. You can even compose functions with fixed values as one of their arguments. For example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> alwaysTrue = ->{f,p}
sparse> print alwaysTrue
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- alwaysTrue ->{f,p} ( !fvp) f = lambda p: ( not False or p) sparse> table alwaysTrue
+---+----------------------+
| p | (alwaysTrue) ->{f,p} |
+---+----------------------+
| F | True |
| T | True |
+---+----------------------+

In this example, alwaysTrue is defined as False -> p and takes one argument, p. This is always true, which the truth table of alwaysTrue reflects.

WARNING: Function composition is the part of SPARSE I am least confident in. If you find a bug, see message at the bottom of this readme.

Basic commands

Typing help in the sparse terminal will list commands, what they do, and how to use them.

Support

If you have new feature requests or bug reports, feel free to create an issue on the github page and/or email me at xtremesoftwaredev@gmail.com. For the time being I am actively supporting this project. If this ever changes I will change this message to let you know.

you are free to copy the cone from this project and make edits yourself, but this repo is a push mirror of a private repo of mine, so external edits made here will not stick around.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SPARSE

Stands for Symbolic logic PARSEr. This is a program that leverages python lambda functions to parse and perform basic tasks with symbolic logic.

Using SPARSE

SPARSE is a command line program executed by typing python3 sparsein the sparse directory. You can also double click the sparse file on a Windows machine if you have it so configured. You can also use the --verbose and --devmode command line arguments to add more description of what SPARSE is up to if you would like.

If you do not have git installed on your machine, you can dowload and extract the zip files from this webpage.

I hate it when software vendors demonize their customers and prevent good use of their software through excessive fees and usage contracts, but I also recognize and share the desire to profit off of one's hard work. In that spirit, I provide this software free of charge and free to distribute, but I ask that you keep this message attached. I am also providing a link to my venmo account below. If you use this program and think it has given you value, I would be grateful if you would pay me for that value. Thanks!

Syntax

The sparse syntax is very basic and can be summed up in the following way:

Basic symbols:

  • ^ -> boolean AND
  • v -> boolean OR
  • ! -> boolean NOT

Function definition

Functions are defined by typing the function name and then the function definition using logic symbols. An example would be G = (p^q), where G is defined as boolean (p and q). You can also compose functions with one another to create larger functions. For example, using the previous function G, you could make another function H where H = !G, which would define H as boolean !(p^q). It is important to note when combining functions that the variables from the sub-function are reused directly. For example, if I define A = p and B = A^!p, the resulting function would be defined as B = p^!p, because it inherited the p variable from the function A. Also, it is extremely important to ensure that you do not attempt to use the arguments T,F,t or f in your functions or as function names because these are reserved for inputs to functions and are mapped to true false values directly. Here are some example function definitions:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> xor = (pvq)^!(p^q)
sparse> table xor
+-----+--------------------+
| p,q | (xor) (pvq)^!(p^q) |
+-----+--------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+--------------------+

Comparing functions

You can compare logical functions with the == operator. typing f1 == f2 in the sparse terminal will print True if the functions are logically equivalent (if their truth tables are equal) and False if not. You can also compare several functions at once, but if any of the comparisons are false, the entire statement will evaluate to false. Here are some examples of function comparison:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> p == p
True
sparse> p == q
True
sparse> p == !p
False
sparse> (pvq) == !(!p^!q)
True
sparse> (pvq) == !(!p^!q) == (p^q)
False
sparse> (pvq) == !(!p^!q) == !!(pvq)
True

As you can see here, the arguments are intrinsic to each term in the comparison: the sparse interpreter defines a new logical function for each term. This is why p == q is True; their truth tables are equivalent and the names of the arguments used (p in function 1 and q in function 2) don't impact their truth tables. Here are the truth tables for these functions generated by the sparse table command:

sparse> table p
+---+----------+
| p | (anon) p |
+---+----------+
| F | False |
| T | True |
+---+----------+
sparse> table q
+---+----------+
| q | (anon) q |
+---+----------+
| F | False |
| T | True |
+---+----------+

It's clear from this that they are equal even though the names of the arguments are different.

Evaluating functions at given truth values

You can evaluate sparse functions with the { and } operators. These allow you to feed sparse specific arguments for the function to use when it runs. You can use 0, 1, T, F, t, or f as arguments. Here is an example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> nand{0,0}
True
sparse> nand{0,1}
True
sparse> nand{1,1}
False
sparse> nand{F,F}
True
sparse> nand{F,T}
True
sparse> nand{T,T}
False
sparse> nand{T,t}
False
sparse> nand{T,1}
False
sparse> nand{T,0}
True
sparse> nand{f,t}
True

Composing functions

SPARSE has a powerful mechanism for defining new functions based off of other predefined functions. You can again use the { and } operators to feed functions different variable names as arguments, or even different functions as arguments. Let's say you want to see what the truth table for this function is: p -> q or q -> p. Here's how you would go about that in sparse:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> func = ->{p,q} v ->{q,p}
sparse> print func
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- func ->{p,q} v ->{q,p} ( !pvq) v ( !qvp) f = lambda p,q: ( not p or q) or ( not q or p) sparse> table func
+-----+--------------------------+
| p,q | (func) ->{p,q} v ->{q,p} |
+-----+--------------------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------+

Now let's say you want to define an or function from only nand functions. Here's how you could do that:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> or = nand{nand{p,p},nand{q,q}}
sparse> table or
+-----+--------------------------------+
| p,q | (or) nand{nand{p,p},nand{q,q}} |
+-----+--------------------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------------+

This same idea can be used for pretty much any function composition you want. You can even compose functions with fixed values as one of their arguments. For example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> alwaysTrue = ->{f,p}
sparse> print alwaysTrue
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- alwaysTrue ->{f,p} ( !fvp) f = lambda p: ( not False or p) sparse> table alwaysTrue
+---+----------------------+
| p | (alwaysTrue) ->{f,p} |
+---+----------------------+
| F | True |
| T | True |
+---+----------------------+

In this example, alwaysTrue is defined as False -> p and takes one argument, p. This is always true, which the truth table of alwaysTrue reflects.

WARNING: Function composition is the part of SPARSE I am least confident in. If you find a bug, see message at the bottom of this readme.

Basic commands

Typing help in the sparse terminal will list commands, what they do, and how to use them.

Support

If you have new feature requests or bug reports, feel free to create an issue on the github page and/or email me at xtremesoftwaredev@gmail.com. For the time being I am actively supporting this project. If this ever changes I will change this message to let you know.

you are free to copy the cone from this project and make edits yourself, but this repo is a push mirror of a private repo of mine, so external edits made here will not stick around.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SPARSE

Stands for Symbolic logic PARSEr. This is a program that leverages python lambda functions to parse and perform basic tasks with symbolic logic.

Using SPARSE

SPARSE is a command line program executed by typing python3 sparsein the sparse directory. You can also double click the sparse file on a Windows machine if you have it so configured. You can also use the --verbose and --devmode command line arguments to add more description of what SPARSE is up to if you would like.

If you do not have git installed on your machine, you can dowload and extract the zip files from this webpage.

I hate it when software vendors demonize their customers and prevent good use of their software through excessive fees and usage contracts, but I also recognize and share the desire to profit off of one's hard work. In that spirit, I provide this software free of charge and free to distribute, but I ask that you keep this message attached. I am also providing a link to my venmo account below. If you use this program and think it has given you value, I would be grateful if you would pay me for that value. Thanks!

Syntax

The sparse syntax is very basic and can be summed up in the following way:

Basic symbols:

  • ^ -> boolean AND
  • v -> boolean OR
  • ! -> boolean NOT

Function definition

Functions are defined by typing the function name and then the function definition using logic symbols. An example would be G = (p^q), where G is defined as boolean (p and q). You can also compose functions with one another to create larger functions. For example, using the previous function G, you could make another function H where H = !G, which would define H as boolean !(p^q). It is important to note when combining functions that the variables from the sub-function are reused directly. For example, if I define A = p and B = A^!p, the resulting function would be defined as B = p^!p, because it inherited the p variable from the function A. Also, it is extremely important to ensure that you do not attempt to use the arguments T,F,t or f in your functions or as function names because these are reserved for inputs to functions and are mapped to true false values directly. Here are some example function definitions:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> xor = (pvq)^!(p^q)
sparse> table xor
+-----+--------------------+
| p,q | (xor) (pvq)^!(p^q) |
+-----+--------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+--------------------+

Comparing functions

You can compare logical functions with the == operator. typing f1 == f2 in the sparse terminal will print True if the functions are logically equivalent (if their truth tables are equal) and False if not. You can also compare several functions at once, but if any of the comparisons are false, the entire statement will evaluate to false. Here are some examples of function comparison:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> p == p
True
sparse> p == q
True
sparse> p == !p
False
sparse> (pvq) == !(!p^!q)
True
sparse> (pvq) == !(!p^!q) == (p^q)
False
sparse> (pvq) == !(!p^!q) == !!(pvq)
True

As you can see here, the arguments are intrinsic to each term in the comparison: the sparse interpreter defines a new logical function for each term. This is why p == q is True; their truth tables are equivalent and the names of the arguments used (p in function 1 and q in function 2) don't impact their truth tables. Here are the truth tables for these functions generated by the sparse table command:

sparse> table p
+---+----------+
| p | (anon) p |
+---+----------+
| F | False |
| T | True |
+---+----------+
sparse> table q
+---+----------+
| q | (anon) q |
+---+----------+
| F | False |
| T | True |
+---+----------+

It's clear from this that they are equal even though the names of the arguments are different.

Evaluating functions at given truth values

You can evaluate sparse functions with the { and } operators. These allow you to feed sparse specific arguments for the function to use when it runs. You can use 0, 1, T, F, t, or f as arguments. Here is an example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> nand{0,0}
True
sparse> nand{0,1}
True
sparse> nand{1,1}
False
sparse> nand{F,F}
True
sparse> nand{F,T}
True
sparse> nand{T,T}
False
sparse> nand{T,t}
False
sparse> nand{T,1}
False
sparse> nand{T,0}
True
sparse> nand{f,t}
True

Composing functions

SPARSE has a powerful mechanism for defining new functions based off of other predefined functions. You can again use the { and } operators to feed functions different variable names as arguments, or even different functions as arguments. Let's say you want to see what the truth table for this function is: p -> q or q -> p. Here's how you would go about that in sparse:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> func = ->{p,q} v ->{q,p}
sparse> print func
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- func ->{p,q} v ->{q,p} ( !pvq) v ( !qvp) f = lambda p,q: ( not p or q) or ( not q or p) sparse> table func
+-----+--------------------------+
| p,q | (func) ->{p,q} v ->{q,p} |
+-----+--------------------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------+

Now let's say you want to define an or function from only nand functions. Here's how you could do that:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> or = nand{nand{p,p},nand{q,q}}
sparse> table or
+-----+--------------------------------+
| p,q | (or) nand{nand{p,p},nand{q,q}} |
+-----+--------------------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------------+

This same idea can be used for pretty much any function composition you want. You can even compose functions with fixed values as one of their arguments. For example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> alwaysTrue = ->{f,p}
sparse> print alwaysTrue
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- alwaysTrue ->{f,p} ( !fvp) f = lambda p: ( not False or p) sparse> table alwaysTrue
+---+----------------------+
| p | (alwaysTrue) ->{f,p} |
+---+----------------------+
| F | True |
| T | True |
+---+----------------------+

In this example, alwaysTrue is defined as False -> p and takes one argument, p. This is always true, which the truth table of alwaysTrue reflects.

WARNING: Function composition is the part of SPARSE I am least confident in. If you find a bug, see message at the bottom of this readme.

Basic commands

Typing help in the sparse terminal will list commands, what they do, and how to use them.

Support

If you have new feature requests or bug reports, feel free to create an issue on the github page and/or email me at xtremesoftwaredev@gmail.com. For the time being I am actively supporting this project. If this ever changes I will change this message to let you know.

you are free to copy the cone from this project and make edits yourself, but this repo is a push mirror of a private repo of mine, so external edits made here will not stick around.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SPARSE

Stands for Symbolic logic PARSEr. This is a program that leverages python lambda functions to parse and perform basic tasks with symbolic logic.

Using SPARSE

SPARSE is a command line program executed by typing python3 sparsein the sparse directory. You can also double click the sparse file on a Windows machine if you have it so configured. You can also use the --verbose and --devmode command line arguments to add more description of what SPARSE is up to if you would like.

If you do not have git installed on your machine, you can dowload and extract the zip files from this webpage.

I hate it when software vendors demonize their customers and prevent good use of their software through excessive fees and usage contracts, but I also recognize and share the desire to profit off of one's hard work. In that spirit, I provide this software free of charge and free to distribute, but I ask that you keep this message attached. I am also providing a link to my venmo account below. If you use this program and think it has given you value, I would be grateful if you would pay me for that value. Thanks!

Syntax

The sparse syntax is very basic and can be summed up in the following way:

Basic symbols:

  • ^ -> boolean AND
  • v -> boolean OR
  • ! -> boolean NOT

Function definition

Functions are defined by typing the function name and then the function definition using logic symbols. An example would be G = (p^q), where G is defined as boolean (p and q). You can also compose functions with one another to create larger functions. For example, using the previous function G, you could make another function H where H = !G, which would define H as boolean !(p^q). It is important to note when combining functions that the variables from the sub-function are reused directly. For example, if I define A = p and B = A^!p, the resulting function would be defined as B = p^!p, because it inherited the p variable from the function A. Also, it is extremely important to ensure that you do not attempt to use the arguments T,F,t or f in your functions or as function names because these are reserved for inputs to functions and are mapped to true false values directly. Here are some example function definitions:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> xor = (pvq)^!(p^q)
sparse> table xor
+-----+--------------------+
| p,q | (xor) (pvq)^!(p^q) |
+-----+--------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+--------------------+

Comparing functions

You can compare logical functions with the == operator. typing f1 == f2 in the sparse terminal will print True if the functions are logically equivalent (if their truth tables are equal) and False if not. You can also compare several functions at once, but if any of the comparisons are false, the entire statement will evaluate to false. Here are some examples of function comparison:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> p == p
True
sparse> p == q
True
sparse> p == !p
False
sparse> (pvq) == !(!p^!q)
True
sparse> (pvq) == !(!p^!q) == (p^q)
False
sparse> (pvq) == !(!p^!q) == !!(pvq)
True

As you can see here, the arguments are intrinsic to each term in the comparison: the sparse interpreter defines a new logical function for each term. This is why p == q is True; their truth tables are equivalent and the names of the arguments used (p in function 1 and q in function 2) don't impact their truth tables. Here are the truth tables for these functions generated by the sparse table command:

sparse> table p
+---+----------+
| p | (anon) p |
+---+----------+
| F | False |
| T | True |
+---+----------+
sparse> table q
+---+----------+
| q | (anon) q |
+---+----------+
| F | False |
| T | True |
+---+----------+

It's clear from this that they are equal even though the names of the arguments are different.

Evaluating functions at given truth values

You can evaluate sparse functions with the { and } operators. These allow you to feed sparse specific arguments for the function to use when it runs. You can use 0, 1, T, F, t, or f as arguments. Here is an example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> nand{0,0}
True
sparse> nand{0,1}
True
sparse> nand{1,1}
False
sparse> nand{F,F}
True
sparse> nand{F,T}
True
sparse> nand{T,T}
False
sparse> nand{T,t}
False
sparse> nand{T,1}
False
sparse> nand{T,0}
True
sparse> nand{f,t}
True

Composing functions

SPARSE has a powerful mechanism for defining new functions based off of other predefined functions. You can again use the { and } operators to feed functions different variable names as arguments, or even different functions as arguments. Let's say you want to see what the truth table for this function is: p -> q or q -> p. Here's how you would go about that in sparse:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> func = ->{p,q} v ->{q,p}
sparse> print func
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- func ->{p,q} v ->{q,p} ( !pvq) v ( !qvp) f = lambda p,q: ( not p or q) or ( not q or p) sparse> table func
+-----+--------------------------+
| p,q | (func) ->{p,q} v ->{q,p} |
+-----+--------------------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------+

Now let's say you want to define an or function from only nand functions. Here's how you could do that:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> or = nand{nand{p,p},nand{q,q}}
sparse> table or
+-----+--------------------------------+
| p,q | (or) nand{nand{p,p},nand{q,q}} |
+-----+--------------------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------------+

This same idea can be used for pretty much any function composition you want. You can even compose functions with fixed values as one of their arguments. For example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> alwaysTrue = ->{f,p}
sparse> print alwaysTrue
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- alwaysTrue ->{f,p} ( !fvp) f = lambda p: ( not False or p) sparse> table alwaysTrue
+---+----------------------+
| p | (alwaysTrue) ->{f,p} |
+---+----------------------+
| F | True |
| T | True |
+---+----------------------+

In this example, alwaysTrue is defined as False -> p and takes one argument, p. This is always true, which the truth table of alwaysTrue reflects.

WARNING: Function composition is the part of SPARSE I am least confident in. If you find a bug, see message at the bottom of this readme.

Basic commands

Typing help in the sparse terminal will list commands, what they do, and how to use them.

Support

If you have new feature requests or bug reports, feel free to create an issue on the github page and/or email me at xtremesoftwaredev@gmail.com. For the time being I am actively supporting this project. If this ever changes I will change this message to let you know.

you are free to copy the cone from this project and make edits yourself, but this repo is a push mirror of a private repo of mine, so external edits made here will not stick around.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SPARSE

Stands for Symbolic logic PARSEr. This is a program that leverages python lambda functions to parse and perform basic tasks with symbolic logic.

Using SPARSE

SPARSE is a command line program executed by typing python3 sparsein the sparse directory. You can also double click the sparse file on a Windows machine if you have it so configured. You can also use the --verbose and --devmode command line arguments to add more description of what SPARSE is up to if you would like.

If you do not have git installed on your machine, you can dowload and extract the zip files from this webpage.

I hate it when software vendors demonize their customers and prevent good use of their software through excessive fees and usage contracts, but I also recognize and share the desire to profit off of one's hard work. In that spirit, I provide this software free of charge and free to distribute, but I ask that you keep this message attached. I am also providing a link to my venmo account below. If you use this program and think it has given you value, I would be grateful if you would pay me for that value. Thanks!

Syntax

The sparse syntax is very basic and can be summed up in the following way:

Basic symbols:

  • ^ -> boolean AND
  • v -> boolean OR
  • ! -> boolean NOT

Function definition

Functions are defined by typing the function name and then the function definition using logic symbols. An example would be G = (p^q), where G is defined as boolean (p and q). You can also compose functions with one another to create larger functions. For example, using the previous function G, you could make another function H where H = !G, which would define H as boolean !(p^q). It is important to note when combining functions that the variables from the sub-function are reused directly. For example, if I define A = p and B = A^!p, the resulting function would be defined as B = p^!p, because it inherited the p variable from the function A. Also, it is extremely important to ensure that you do not attempt to use the arguments T,F,t or f in your functions or as function names because these are reserved for inputs to functions and are mapped to true false values directly. Here are some example function definitions:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> xor = (pvq)^!(p^q)
sparse> table xor
+-----+--------------------+
| p,q | (xor) (pvq)^!(p^q) |
+-----+--------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+--------------------+

Comparing functions

You can compare logical functions with the == operator. typing f1 == f2 in the sparse terminal will print True if the functions are logically equivalent (if their truth tables are equal) and False if not. You can also compare several functions at once, but if any of the comparisons are false, the entire statement will evaluate to false. Here are some examples of function comparison:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> p == p
True
sparse> p == q
True
sparse> p == !p
False
sparse> (pvq) == !(!p^!q)
True
sparse> (pvq) == !(!p^!q) == (p^q)
False
sparse> (pvq) == !(!p^!q) == !!(pvq)
True

As you can see here, the arguments are intrinsic to each term in the comparison: the sparse interpreter defines a new logical function for each term. This is why p == q is True; their truth tables are equivalent and the names of the arguments used (p in function 1 and q in function 2) don't impact their truth tables. Here are the truth tables for these functions generated by the sparse table command:

sparse> table p
+---+----------+
| p | (anon) p |
+---+----------+
| F | False |
| T | True |
+---+----------+
sparse> table q
+---+----------+
| q | (anon) q |
+---+----------+
| F | False |
| T | True |
+---+----------+

It's clear from this that they are equal even though the names of the arguments are different.

Evaluating functions at given truth values

You can evaluate sparse functions with the { and } operators. These allow you to feed sparse specific arguments for the function to use when it runs. You can use 0, 1, T, F, t, or f as arguments. Here is an example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> nand{0,0}
True
sparse> nand{0,1}
True
sparse> nand{1,1}
False
sparse> nand{F,F}
True
sparse> nand{F,T}
True
sparse> nand{T,T}
False
sparse> nand{T,t}
False
sparse> nand{T,1}
False
sparse> nand{T,0}
True
sparse> nand{f,t}
True

Composing functions

SPARSE has a powerful mechanism for defining new functions based off of other predefined functions. You can again use the { and } operators to feed functions different variable names as arguments, or even different functions as arguments. Let's say you want to see what the truth table for this function is: p -> q or q -> p. Here's how you would go about that in sparse:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> func = ->{p,q} v ->{q,p}
sparse> print func
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- func ->{p,q} v ->{q,p} ( !pvq) v ( !qvp) f = lambda p,q: ( not p or q) or ( not q or p) sparse> table func
+-----+--------------------------+
| p,q | (func) ->{p,q} v ->{q,p} |
+-----+--------------------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------+

Now let's say you want to define an or function from only nand functions. Here's how you could do that:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> or = nand{nand{p,p},nand{q,q}}
sparse> table or
+-----+--------------------------------+
| p,q | (or) nand{nand{p,p},nand{q,q}} |
+-----+--------------------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------------+

This same idea can be used for pretty much any function composition you want. You can even compose functions with fixed values as one of their arguments. For example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> alwaysTrue = ->{f,p}
sparse> print alwaysTrue
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- alwaysTrue ->{f,p} ( !fvp) f = lambda p: ( not False or p) sparse> table alwaysTrue
+---+----------------------+
| p | (alwaysTrue) ->{f,p} |
+---+----------------------+
| F | True |
| T | True |
+---+----------------------+

In this example, alwaysTrue is defined as False -> p and takes one argument, p. This is always true, which the truth table of alwaysTrue reflects.

WARNING: Function composition is the part of SPARSE I am least confident in. If you find a bug, see message at the bottom of this readme.

Basic commands

Typing help in the sparse terminal will list commands, what they do, and how to use them.

Support

If you have new feature requests or bug reports, feel free to create an issue on the github page and/or email me at xtremesoftwaredev@gmail.com. For the time being I am actively supporting this project. If this ever changes I will change this message to let you know.

you are free to copy the cone from this project and make edits yourself, but this repo is a push mirror of a private repo of mine, so external edits made here will not stick around.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

23 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

SPARSE

Stands for Symbolic logic PARSEr. This is a program that leverages python lambda functions to parse and perform basic tasks with symbolic logic.

Using SPARSE

SPARSE is a command line program executed by typing python3 sparsein the sparse directory. You can also double click the sparse file on a Windows machine if you have it so configured. You can also use the --verbose and --devmode command line arguments to add more description of what SPARSE is up to if you would like.

If you do not have git installed on your machine, you can dowload and extract the zip files from this webpage.

I hate it when software vendors demonize their customers and prevent good use of their software through excessive fees and usage contracts, but I also recognize and share the desire to profit off of one's hard work. In that spirit, I provide this software free of charge and free to distribute, but I ask that you keep this message attached. I am also providing a link to my venmo account below. If you use this program and think it has given you value, I would be grateful if you would pay me for that value. Thanks!

Syntax

The sparse syntax is very basic and can be summed up in the following way:

Basic symbols:

  • ^ -> boolean AND
  • v -> boolean OR
  • ! -> boolean NOT

Function definition

Functions are defined by typing the function name and then the function definition using logic symbols. An example would be G = (p^q), where G is defined as boolean (p and q). You can also compose functions with one another to create larger functions. For example, using the previous function G, you could make another function H where H = !G, which would define H as boolean !(p^q). It is important to note when combining functions that the variables from the sub-function are reused directly. For example, if I define A = p and B = A^!p, the resulting function would be defined as B = p^!p, because it inherited the p variable from the function A. Also, it is extremely important to ensure that you do not attempt to use the arguments T,F,t or f in your functions or as function names because these are reserved for inputs to functions and are mapped to true false values directly. Here are some example function definitions:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> xor = (pvq)^!(p^q)
sparse> table xor
+-----+--------------------+
| p,q | (xor) (pvq)^!(p^q) |
+-----+--------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+--------------------+

Comparing functions

You can compare logical functions with the == operator. typing f1 == f2 in the sparse terminal will print True if the functions are logically equivalent (if their truth tables are equal) and False if not. You can also compare several functions at once, but if any of the comparisons are false, the entire statement will evaluate to false. Here are some examples of function comparison:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> p == p
True
sparse> p == q
True
sparse> p == !p
False
sparse> (pvq) == !(!p^!q)
True
sparse> (pvq) == !(!p^!q) == (p^q)
False
sparse> (pvq) == !(!p^!q) == !!(pvq)
True

As you can see here, the arguments are intrinsic to each term in the comparison: the sparse interpreter defines a new logical function for each term. This is why p == q is True; their truth tables are equivalent and the names of the arguments used (p in function 1 and q in function 2) don't impact their truth tables. Here are the truth tables for these functions generated by the sparse table command:

sparse> table p
+---+----------+
| p | (anon) p |
+---+----------+
| F | False |
| T | True |
+---+----------+
sparse> table q
+---+----------+
| q | (anon) q |
+---+----------+
| F | False |
| T | True |
+---+----------+

It's clear from this that they are equal even though the names of the arguments are different.

Evaluating functions at given truth values

You can evaluate sparse functions with the { and } operators. These allow you to feed sparse specific arguments for the function to use when it runs. You can use 0, 1, T, F, t, or f as arguments. Here is an example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> nand{0,0}
True
sparse> nand{0,1}
True
sparse> nand{1,1}
False
sparse> nand{F,F}
True
sparse> nand{F,T}
True
sparse> nand{T,T}
False
sparse> nand{T,t}
False
sparse> nand{T,1}
False
sparse> nand{T,0}
True
sparse> nand{f,t}
True

Composing functions

SPARSE has a powerful mechanism for defining new functions based off of other predefined functions. You can again use the { and } operators to feed functions different variable names as arguments, or even different functions as arguments. Let's say you want to see what the truth table for this function is: p -> q or q -> p. Here's how you would go about that in sparse:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> func = ->{p,q} v ->{q,p}
sparse> print func
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- func ->{p,q} v ->{q,p} ( !pvq) v ( !qvp) f = lambda p,q: ( not p or q) or ( not q or p) sparse> table func
+-----+--------------------------+
| p,q | (func) ->{p,q} v ->{q,p} |
+-----+--------------------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------+

Now let's say you want to define an or function from only nand functions. Here's how you could do that:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> nand = !(p^q)
sparse> table nand
+-----+---------------+
| p,q | (nand) !(p^q) |
+-----+---------------+
| F,F | True |
| F,T | True |
| T,F | True |
| T,T | False |
+-----+---------------+
sparse> or = nand{nand{p,p},nand{q,q}}
sparse> table or
+-----+--------------------------------+
| p,q | (or) nand{nand{p,p},nand{q,q}} |
+-----+--------------------------------+
| F,F | False |
| F,T | True |
| T,F | True |
| T,T | True |
+-----+--------------------------------+

This same idea can be used for pretty much any function composition you want. You can even compose functions with fixed values as one of their arguments. For example:

Welcome to SPARSE (Symbolic logic PARSEr) version 2.0. Type 'help' for a list of commands and uses.
Read the README.md for explanation of syntax and usage. Enjoy!
AUTHOR: James Burkett (Xtreme Software Developers) ; (xtremesoftwaredev@gmail.com)
sparse> -> = !pvq
sparse> table ->
+-----+-----------+
| p,q | (->) !pvq |
+-----+-----------+
| F,F | True |
| F,T | True |
| T,F | False |
| T,T | True |
+-----+-----------+
sparse> alwaysTrue = ->{f,p}
sparse> print alwaysTrue
Function Name User Definition Fully Substituted Definition Lambda Function Definition ------------- --------------- ---------------------------- -------------------------- alwaysTrue ->{f,p} ( !fvp) f = lambda p: ( not False or p) sparse> table alwaysTrue
+---+----------------------+
| p | (alwaysTrue) ->{f,p} |
+---+----------------------+
| F | True |
| T | True |
+---+----------------------+

In this example, alwaysTrue is defined as False -> p and takes one argument, p. This is always true, which the truth table of alwaysTrue reflects.

WARNING: Function composition is the part of SPARSE I am least confident in. If you find a bug, see message at the bottom of this readme.

Basic commands

Typing help in the sparse terminal will list commands, what they do, and how to use them.

Support

If you have new feature requests or bug reports, feel free to create an issue on the github page and/or email me at xtremesoftwaredev@gmail.com. For the time being I am actively supporting this project. If this ever changes I will change this message to let you know.

you are free to copy the cone from this project and make edits yourself, but this repo is a push mirror of a private repo of mine, so external edits made here will not stick around.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages