Xah Prolog Learning Notes
This is my learning notes. When this tutorial is robust, i'll remove this paragraph.
install
# install prolog sudo apt-get install swi-prolog
this will install the command /usr/bin/swipl
there's also a alias /usr/bin/prolog
to swipl.
the following are also installed, but you don't have to worry about them now.
prolog -> /etc/alternatives/prolog swipl -> ../lib/swi-prolog/bin/amd64/swipl swipl-ld -> ../lib/swi-prolog/bin/amd64/swipl-ld swipl-rc -> ../lib/swi-prolog/bin/amd64/swipl-rc xpce -> ../lib/swi-prolog/bin/amd64/xpce xpce-client -> ../lib/swi-prolog/xpce-6.6.66/bin/amd64/xpce-client
you can now man swipl
to read the man page if you like.
he syntax for a fact is
pred(arg1, arg2, ... argN).
where
pred The name of the predicate arg1, ... The arguments N The arity . The syntactic end of all Prolog clauses
A predicate of arity 0 is simply
pred.
The arguments can be any legal Prolog term. The basic Prolog terms are integer A positive or negative number whose absolute value is less than some implementation-specific power of 2 atom A text constant beginning with a lowercase letter variable Begins with an uppercase letter or underscore (_) structure Complex terms, which will be covered in chapter 9 Various Prolog implementations enhance this basic list with other data types, such as floating point numbers, or strings. The Prolog character set is made up of Uppercase letters, A-Z Lowercase letters, a-z Digits, 0-9 Symbols, + - * / \ ^ , . ~ : . ? @ # $ & Integers are made from digits. Other numerical types are allowed in some Prolog implementations. Atoms are usually made from letters and digits with the first character being a lowercase letter, such as hello twoWordsTogether x14 For readability, the underscore (_), but not the hyphen (-), can be used as a separator in longer names. So the following are legal. a_long_atom_name z_23 The following are not legal atoms. no-embedded-hyphens 123nodigitsatbeginning _nounderscorefirst Nocapsfirst Use single quotes to make any character combination a legal atom as follows. 'this-hyphen-is-ok' 'UpperCase' 'embedded blanks' Do not use double quotes ("") to build atoms. This is a special syntax that causes the character string to be treated as a list of ASCII character codes. Atoms can also be legally made from symbols, as follows. ++ Variables are similar to atoms, but are distinguished by beginning with either an uppercase letter or the underscore (_). X Input_List _4th_argument Z56 Using these building blocks, we can start to code facts. The predicate name follows the rules for atoms. The arguments can be any Prolog terms. Facts are often used to store the data a program is using. For example, a business application might have customer/3. customer('John Jones', boston, good_credit). customer('Sally Smith', chicago, good_credit). The single quotes are needed around the names because they begin with uppercase letters and because they have embedded blanks. Another example is a windowing system that uses facts to store data about the various windows. In this example the arguments give the window name and coordinates of the upper left and lower right corners. window(main, 2, 2, 20, 72). window(errors, 15, 40, 20, 78).
Simple Queries
?- room(office). yes
Prolog will respond with a 'yes' if a match was found. If we wanted to know if the attic was a room, we would enter that goal.
?- room(attic). no
room(kitchen). room(office). room(hall). room('dining room'). room(cellar). door(office, hall). door(kitchen, office). door(hall, 'dining room'). door(kitchen, cellar). door('dining room', kitchen). location(desk, office). location(apple, kitchen). location(flashlight, desk). location('washing machine', cellar). location(nani, 'washing machine'). location(broccoli, kitchen). location(crackers, kitchen). location(computer, office). edible(apple). edible(crackers). tastes_yucky(broccoli). here(kitchen).
?- room(X). X = kitchen ; X = office ; X = hall ; X = 'dining room' ; X = cellar ; no
?- location(Thing, kitchen). Thing = apple ; Thing = broccoli ; Thing = crackers ; no
Compound Queries
Simple goals can be combined to form compound queries. For example, we might want to know if there is anything good to eat in the kitchen. In Prolog we might ask
?- location(X, kitchen), edible(X).
to load a prolog file in terminal,
prolog -f filename.pl
, it'll start repl anyway.
to load a file in repl, do consult filename.pl
Reference
- [ http://www.doc.gold.ac.uk/~mas02gw/prolog_tutorial/prologpages/ ]
- [ https://en.wikipedia.org/wiki/Prolog ]
- [ http://www.learnprolognow.org/lpnpage.php ]
- [ http://www.amzi.com/AdventureInProlog/a1start.php ]