summaryrefslogtreecommitdiff
path: root/sites/prolog.pmikkelsen.com
diff options
context:
space:
mode:
Diffstat (limited to 'sites/prolog.pmikkelsen.com')
-rw-r--r--sites/prolog.pmikkelsen.com/_images/screenshot.pngbin0 -> 40738 bytes
-rw-r--r--sites/prolog.pmikkelsen.com/_werc/config3
-rw-r--r--sites/prolog.pmikkelsen.com/_werc/lib/footer.inc1
-rw-r--r--sites/prolog.pmikkelsen.com/_werc/lib/top_bar.inc8
-rw-r--r--sites/prolog.pmikkelsen.com/_werc/pub/style.css122
-rw-r--r--sites/prolog.pmikkelsen.com/about.md0
-rw-r--r--sites/prolog.pmikkelsen.com/documentation/index.md28
-rw-r--r--sites/prolog.pmikkelsen.com/documentation/tutorial/1.-install.md17
-rw-r--r--sites/prolog.pmikkelsen.com/documentation/tutorial/2.-prolog-primer.md127
-rw-r--r--sites/prolog.pmikkelsen.com/documentation/tutorial/3.-repl.md0
-rw-r--r--sites/prolog.pmikkelsen.com/documentation/tutorial/4.-writing-and-consulting.md0
-rw-r--r--sites/prolog.pmikkelsen.com/favicon.icobin0 -> 2576 bytes
-rw-r--r--sites/prolog.pmikkelsen.com/index.md72
-rw-r--r--sites/prolog.pmikkelsen.com/source.md0
14 files changed, 378 insertions, 0 deletions
diff --git a/sites/prolog.pmikkelsen.com/_images/screenshot.png b/sites/prolog.pmikkelsen.com/_images/screenshot.png
new file mode 100644
index 0000000..a1e75ce
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/_images/screenshot.png
Binary files differ
diff --git a/sites/prolog.pmikkelsen.com/_werc/config b/sites/prolog.pmikkelsen.com/_werc/config
new file mode 100644
index 0000000..bc8c0e5
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/_werc/config
@@ -0,0 +1,3 @@
+masterSite=prolog.pmikkelsen.com
+siteTitle='PProlog'
+siteSubTitle='A prolog for plan9'
diff --git a/sites/prolog.pmikkelsen.com/_werc/lib/footer.inc b/sites/prolog.pmikkelsen.com/_werc/lib/footer.inc
new file mode 100644
index 0000000..ac3b4a1
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/_werc/lib/footer.inc
@@ -0,0 +1 @@
+<a href="http://werc.cat-v.org">Powered by werc</a> © Peter Mikkelsen 2020-2021 \ No newline at end of file
diff --git a/sites/prolog.pmikkelsen.com/_werc/lib/top_bar.inc b/sites/prolog.pmikkelsen.com/_werc/lib/top_bar.inc
new file mode 100644
index 0000000..e6a79eb
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/_werc/lib/top_bar.inc
@@ -0,0 +1,8 @@
+ <div class="left">
+ <a href="https://git.sr.ht/~pmikkelsen/pprolog">pprolog source code</a> |
+ <a href="https://pmikkelsen.com">pmikkelsen's site</a> |
+ <a href="http://9front.org">9front</a>
+ </div>
+
+ <div class="right">
+ </div>
diff --git a/sites/prolog.pmikkelsen.com/_werc/pub/style.css b/sites/prolog.pmikkelsen.com/_werc/pub/style.css
new file mode 100644
index 0000000..1002606
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/_werc/pub/style.css
@@ -0,0 +1,122 @@
+body { display: flex; flex-wrap: wrap; font-family: sans;}
+header { flex-basis: 100%; flex-shrink: 0; }
+article { flex-basis: 60%; padding-left: 1em; }
+footer { flex-basis: 100%; flex-shrink: 0; }
+header nav { display: flex; justify-content: space-between; }
+nav a, header a { text-decoration: none ; color: inherit; }
+header h1 span { margin-left: 1em; font-size: 50%; font-style: italic; }
+.mainContent > nav { flex-basis: content; padding-right: 1vw; min-width: 16em; }
+nav ul { display: flex; flex-direction: column; list-style-type: none; list-style-position: outside; padding-left: 0; }
+nav li ul { padding-left: 0.6em }
+footer { display: flex; justify-content: space-between; }
+
+/* cut here to leave vanity behind */
+
+body { margin:0; padding: 0; font-size: 84%; font-family: Helvetica, Verdana, Arial, 'Liberation Sans', FreeSans, sans-serif; }
+a { text-decoration: none; color: }
+a:hover { text-decoration: underline; }
+.thisPage { color: black; }
+
+/* header and top bar */
+header nav { background-color: rgb(100,135,220); color: white; padding: 0.3em; border-bottom: 2px solid black; font-size: 91%; }
+header h1 { background-color: #ff6d06; color: black; margin: 0; border-bottom: 2px solid black; font-weight: normal; padding: 0.25ex; font-size: 233%; }
+header a:hover { text-decoration: none; }
+
+/* sidebar */
+.mainContent > nav { border-right: 1px solid #ddd; padding: 0; }
+.mainContent > nav > div { border-bottom: 1px solid #ddd; }
+.mainContent > nav > div a { color: rgb(0, 102, 204); display: block; text-transform: capitalize; font-weight: bold; padding: 0.25em 1ex 0.25em 2mm; font-size: 102%}
+.mainContent > nav > div a:hover { color: white; background-color: rgb(100,135,220); border-left: black solid 0.2em; text-decoration: none; }
+.mainContent > nav > div p { font-weight: bold; margin: 0 0 0.5em 2mm; padding: 1em 0 0 0; }
+
+/* main copy */
+article { padding: 0.5ex 0 5vh 1vw; }
+article h1, article h2 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; border-bottom: 2px solid rgb(0,102,204); }
+article h3, article h4, article h5 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; }
+article h6, article h7, article h8 { color: rgb(0,102,204); font-weight: bold; margin: 2em 0 0 0; }
+article a { color: rgb(0,102,204); }
+article a:hover { color: rgb(100,135,220); }
+article pre { font-size: 1.2em; }
+
+/* footer */
+footer { color: white; background-color: rgb(100,135,220); }
+footer a { color: inherit; }
+footer div { padding: 1em; }
+
+/* tables */
+table { border: 1px solid rgba(128,128,128,0.5); padding: 0; }
+th { color: white; background-color: rgb(100,135,220); }
+tr:nth-child(odd) { background-color: rgba(128,128,128,0.1) }
+
+/* modifications */
+img {
+ max-width: 100%;
+ border: 1px solid black;
+}
+
+body {
+
+}
+
+header h1 {
+ background-color: #c2d2c6;
+}
+
+html {
+ font-size: 1.2em;
+}
+
+header nav, footer {
+ background-color: #442a13;
+}
+
+code > pre {
+ border: 2px solid #442a13;
+ background-color: #c2d2c6;
+ width: max-content;
+ padding: 0 0.5em;
+}
+
+.mainContent > nav > div a, article a:hover {
+ color: #442a13;
+}
+
+.mainContent > nav > div a:hover {
+ color: #442a13;
+ background-color: #c2d2c6;
+}
+
+article h1, article h2 {
+ color: #c48f3b;
+ border-bottom: 2px solid #442a13;
+}
+
+article a, .thisPage, footer, header nav {
+ color: #c48f3b;
+}
+
+footer {
+ padding: 0.5em;
+ flex-shrink: 1;
+ flex-basis: unset;
+}
+
+header {
+ flex-basis: unset;
+}
+
+html {
+ display: flex;
+ min-height: 100%;
+}
+
+body {
+ flex-direction: column;
+ flex: 1;
+ background-color: #e3dfd7;
+}
+
+.mainContent {
+ display: flex;
+ flex-grow: 1;
+} \ No newline at end of file
diff --git a/sites/prolog.pmikkelsen.com/about.md b/sites/prolog.pmikkelsen.com/about.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/about.md
diff --git a/sites/prolog.pmikkelsen.com/documentation/index.md b/sites/prolog.pmikkelsen.com/documentation/index.md
new file mode 100644
index 0000000..77da430
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/documentation/index.md
@@ -0,0 +1,28 @@
+# Learning prolog
+
+If you are new to prolog the following resources helped me a lot in the
+beginning and they still do:
+
+* [The Power of Prolog](https://www.metalevel.at/prolog) by Markus Triska is a great book about prolog and logic programming and is very up to date.
+It even contains videos for some of its topics which can help a bit. The text is easy to read and
+the chapters are short so it doesn't become overwhelming.
+* [The Art of Prolog](https://mitpress.mit.edu/books/art-prolog) an older book by Leon S. Sterling and Ehud Y. Shapiro which goes much more into
+the details and foundations of logic programming, but since it is older
+it should not be your only learning source. This book is my recommendation for people who are not afraid to read a bit since it is very
+interesting.
+
+Please be aware that some of the things taught in the books aren't supported by pprolog yet, such as constraint logic programming which is used a lot in Triskas book for doing integer arithmetic.
+
+# PProlog tutorial
+
+There exists a mini series to get you up and running with
+the pprolog system:
+
+* [Installing](/documentation/tutorial/1.-install) covers the steps needed to install pprolog on you very own 9front machine.
+* [Prolog primer](/documentation/tutorial/2.-prolog-primer) gives a short introduction to prolog.
+* [Using the repl](/documentation/tutorial/3.-repl) explains how to ask queries to the system at the repl.
+* [Writing and consulting code](/documentation/tutorial/4.-writing-and-consulting). While asking queries using only the standard library and the builtins is fun, it becomes even more fun when you can write your own fact and rules and load them.
+
+# Information about the standard library and the builtins
+
+At the moment [the source](https://git.sr.ht/~pmikkelsen/pprolog) is the documentation. \ No newline at end of file
diff --git a/sites/prolog.pmikkelsen.com/documentation/tutorial/1.-install.md b/sites/prolog.pmikkelsen.com/documentation/tutorial/1.-install.md
new file mode 100644
index 0000000..f6f4bb2
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/documentation/tutorial/1.-install.md
@@ -0,0 +1,17 @@
+# Install
+
+Since pprolog has zero dependencies other than what is available by default on 9front
+it is pretty easy to install.
+
+If you have [git9](https://orib.dev/git9.html) installed the steps are:
+
+ git/clone https://git.sr.ht/~pmikkelsen/pprolog
+ cd pprolog
+ mk install
+
+
+This will install the pprolog binary to `/$objtype/bin`, so you may want to modify
+`BIN` in the `mkfile` to install to somewhere else like `$home/bin/$objtype/`
+
+It will also install the prolog libraries to `/sys/lib/prolog` and this is hardcoded
+in the `mkfile` and in `dat.h` if you want to change that.
diff --git a/sites/prolog.pmikkelsen.com/documentation/tutorial/2.-prolog-primer.md b/sites/prolog.pmikkelsen.com/documentation/tutorial/2.-prolog-primer.md
new file mode 100644
index 0000000..f26345e
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/documentation/tutorial/2.-prolog-primer.md
@@ -0,0 +1,127 @@
+# Introduction
+
+This page provides a *very* brief overview of prolog. For more documentation look at
+[the documentation page](https://pprolog.org/documentation/). Also be aware that this
+introduction is only _my_ explanation, so don't take it as 100% truth.
+
+First of all, prolog is a programming language in the family of languages called
+*logic programming languages*. This means that it is very different from imperative
+or functional programming, so you should read this with an open mind and try to
+forget some of the things you already know.
+
+# Logic
+
+What does it mean to be a logic programming language? Well, it means that the programs written in it
+can be understood as logical rules and results can be inferred from those rules. This leads to a very
+declarative way of writing code which is often much cleaner than what could be written in C for example.
+
+It also means that in prolog we don't write code to tell the computer what to do, we write code to
+express the facts and relations about a problem, and the prolog system then uses those facts and rules
+to infer the result.
+
+# Example
+
+To calculate the length of a list in an imperative language like C, the following code would work.
+
+ typedef struct List List;
+ struct List
+ {
+ int element;
+ List *next;
+ };
+
+ int
+ length(List *list)
+ {
+ int len = 0;
+ for(; list != nil; list = list->next)
+ len++;
+
+ return len;
+ }
+
+It is very clear that the `length` function takes a list as input
+and then runs a loop which increments `len` until the end of the list is reached.
+
+Compare this to the prolog code below which is a prolog predicate with arity 2, also sometimes called
+`length/2` to describe the name and the arity.
+
+ length([], 0).
+ length([_|Tail], N) :-
+ length(Tail, TailLength),
+ N is TailLength + 1.
+
+This code is written in a declarative style and it doesn't express _how_ the length
+of the list is found, it expresses _what_ the length of a list is.
+The code consists of two *clauses*: a fact and a rule.
+
+The fact `length([], 0).` describes that the length of an empty list (`[]`) is zero.
+
+The rule
+
+ length([_|Tail], N) :-
+ length(Tail, TailLength),
+ N is TailLength + 1.
+
+describes that the length of a non-empty list with head `_` (we don't care about the head), and tail `Tail` has
+then length `N` *if*:
+
+1. The length of the tail is `TailLength` *and*
+2. `N` is `TailLength` plus one.
+
+The rule consists of a *head* `length([_|Tail), N)` and two goals separated by a comma which means *and*.
+
+# Wait, is the output just the last parameter?
+
+No, in general much prolog code describes relations between the parameters.
+The length predicate from before as an example of that, but it could just
+as well be used to check if a list has a given length, by providing an input for
+both arguments.
+
+# Queries
+
+When `pprolog` is run it presents a toplevel where queries can be entered. The queries are like questions that
+the prolog system tries to answer. It does this by looking in the *prolog database* which initially consists of
+the predicates which are part of the standard library. Since `length/2` is part of the standard library, we could ask
+
+ ?- length([1,2,3,a,b,c], Len).
+
+And it would respond
+
+ Len = 6.
+
+In general, if a word starts with an uppercase letter it is a variable like `Len`, `Hello`, `X` and `Y`, and otherwise it
+is an *atom* which just represents itself.
+
+To show that `length/2` can be used in multiple ways, consider the query
+
+ ?- length([1,2], 4).
+
+What do you think it will say? The result is
+
+ false.
+
+because it is not possible for the system to infer the the length of the list `[1,2]` is `4` using any of the
+rules in the prolog database. The steps the system takes in calculating this result are:
+
+1. The fact `length([],0)` is tried first but it fails to *unify* (more on that later) with the query since
+the empty list does not unify with our non-empty list, and 0 does not unify with 4.
+2. The rule with the head `length([_|Tail], N)` is chosen at it unifies with our query giving the variables
+`Tail = [2]` and `N = 4`.
+3. The first goal is `length(Tail, TailLength)` and with the value of `Tail` that becomes `length([2], TailLenght)`.
+As in step 1, the first fact does not unify with this goal since `[]` does not unify with `[2]`.
+4. The second rule unifies with our goal and the variables become `Tail = []` and `N = TailLength`. Note that it is perfectly valid
+to assign two unassigned variables to each other in prolog, and this just means that they should now be considered the same, and when one
+of them is unified with a concrete value, the other will get that value too.
+5. The first subgoal is tried again and this time it matches the first rule since `[]` unifies with `[]`, and `0` unifies `TailLength` with
+the side effect that both `TailLength` and `N` is now 0.
+6. We go back to step 4 and continue with subgoal 2 which says that `N` is `TailLength + 1` and N is therefore 1.
+7. We go back to step 3 and continue with subgoal 2 which says that `N` is `TailLength + 1` but this fails since `N` at this
+point was 4 and `TailLength` is 1, but the fact `4 = 1 + 1` is false. Since there are no more rules or facts to try, the whole query fails.
+
+(_that explanation was a mess_)
+
+# Unification
+
+say wut, like pattern matching but works both ways.
+
diff --git a/sites/prolog.pmikkelsen.com/documentation/tutorial/3.-repl.md b/sites/prolog.pmikkelsen.com/documentation/tutorial/3.-repl.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/documentation/tutorial/3.-repl.md
diff --git a/sites/prolog.pmikkelsen.com/documentation/tutorial/4.-writing-and-consulting.md b/sites/prolog.pmikkelsen.com/documentation/tutorial/4.-writing-and-consulting.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/documentation/tutorial/4.-writing-and-consulting.md
diff --git a/sites/prolog.pmikkelsen.com/favicon.ico b/sites/prolog.pmikkelsen.com/favicon.ico
new file mode 100644
index 0000000..745367e
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/favicon.ico
Binary files differ
diff --git a/sites/prolog.pmikkelsen.com/index.md b/sites/prolog.pmikkelsen.com/index.md
new file mode 100644
index 0000000..4d0efc5
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/index.md
@@ -0,0 +1,72 @@
+# Introduction
+
+This is the website for PProlog, a new prolog implementation written
+in C on and for plan 9 (9front specifically). Work started in december 2020
+due to the author's need for a prolog system on 9front. It is pure experimentation
+and the code might be bad in more than a few places.
+
+*NOTE:* There is no development currently, and it is in a kinda broken state after
+a failed attempt of adding modules.
+
+# Features
+
+* A base system based on the WAM (Warren abstract machine) implemented by following the book [here](http://wambook.sourceforge.net/wambook.pdf).
+* Support for extended precision arithmetic via [mp(2)](http://man.9front.org/2/mp).
+* Basic support for definite clause grammars (DCGs). For now DCG's are translated by the parser into difference lists and they do not support everything one expects.
+* Lists.
+* Strings represented as list of char atoms.
+* The basic control predicates such as `,/2`, `;/2`, `->/2` and cut.
+* Full unicode support.
+
+# Status
+
+At this moment the system works OK but it has very few builtin predicates
+and much of what people expect from a working prolog system is still missing.
+
+The list of builtins as of January 13, 2021 is:
+
+* `is/2`
+* `halt/0`
+* `consult/1`
+* `write/1`
+* `read/1`
+* `call/n`
+* `fail/0`
+* `>/2`
+* `==/2`
+* `atom/1`
+* `integer/1`
+* `float/1`
+* `var/1`
+* `compound/1`
+* `term_variables/2`
+
+And the following predicates are implemented in the standard library:
+
+* `=/2`
+* `\=/2`
+* `reverse/2`
+* `samelength/2`
+* `append/3`
+* `member/2`
+* `select/3`
+* `length/2`
+* `nl/0`
+* `phrase/2`
+* `\+/2`
+* `false/0`
+* `true/0`
+* `repeat/0`
+* `once/1`
+* `,/2`
+* `;/2`
+* `->/2`
+* `=\=/2`
+
+and many more all listed [here](https://git.sr.ht/~pmikkelsen/pprolog/tree/master/item/stdlib.pl).
+
+# Screenshot
+
+[![A picture of pprolog in action][1]][1]
+
+[1]: /_images/screenshot.png
diff --git a/sites/prolog.pmikkelsen.com/source.md b/sites/prolog.pmikkelsen.com/source.md
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sites/prolog.pmikkelsen.com/source.md