The language that GUPU supports is basically a subset of (SICStus-)Prolog. There are only a few extentions and lots of restrictions.
< > * # @ !
,
Assertions/Goals,
Negative Assertions.< > * # @ !
%
-comment They have no meaning outside the environment.
<
is a line containing a question of the student;
>
is an answer to a student's questions.
*>
is an answer to a student's questions when it first
appears on the screen. #
is a line of the example
statement. @
is a line of an answer substitution. It is
a temporary line, which is deleted every time an example is saved.
!
is an error line. It is a temporary line which is
deleted and possibly regenerated after saving.
:-
) are treated
differently to SICStus-Prolog. First the complete program text is
loaded, and only then are assertions tested. It is thus possible to
write an assertion/goal before the definition of a predicate. In
SICStus-Prolog these goals are executed while compiling the program
text. Therefore assertions in SICStus can only be written after a
predicate's definition.
:/- Goal
is operationally
equivalent to :- \+ (Goal)
. It's just syntactic sugar,
to avoid talking about negation proper too early in the course.
If the restrictions below are violated an example cannot be loaded. So you have to fix the example first. Prior experience has shown that warnings as e.g. SICStus produces them for void variables are ignored by most of the students.
Overview.
/* */
comments,
Layout of predicates,
Old fashioned BIPs,
I/O-predicates,
Misleading predicates,
Orthographical errors in names,
Declarative errors in names,
Void variables,
Variable names,
Atoms,
\+/1
in assertions,
Badly typed predicates,
Incorrect usage of BIPs,
Ad hoc restrictions,
et cetera.
/* */
comments
%
-comments are possible.
%
.
Empty lines are used to separate different predicates.
a. b. a. ! Prädikat erneut definiert:a/0
a :- b, c. ! a«*»:- b, c. ! Operator wird nach Ausdruck erwartet. U.U. fehlt eine öffnende Klammer oder ein Komma. ! Möglicher Grund für den Syntaxfehler: ! Hier steht eine ganze Regel in einer Zeile, ! jedoch nur der Kopf der Regel sollte hier stehen und ! jedes weitere Ziel der Regel in einer weiteren Zeile. ! Siehe Skriptum.
a :- b, ! ! Definition von:a/0-nicht abgeschlossen a.
name/2
atom_chars/2
, number_chars/2
are proposed.
:- name(Atomic,Chars). ! Bitte verwenden Sie nicht das vordefinierte Prädikat name/2 sondern statt dessen atom_chars/2 oder number_chars/2. Je nachdem. \Hinweis{BIP_name} begründet, warum name/2 keine gute Idee ist.
:- format('Hello world~n', []). ! ! Das Prädikat :format/2: ist ein vordefiniertes Prädikat mit Seiteneffekten. Ist in dieser Umgebung nicht erlaubt und gar nicht sinnvoll.
-/2
borders
instead of broders
.
append
, add
,
merge
, reverse
.
_
. In the head
voids must have a name to document an arguments meaning. In the case
below _Xs
instead of _
is definitely
preferable, just to underline, that the tail should be a list.
member(X,[X|_]). ! Bitte verwenden Sie für _ Variablen in diesem Faktum sprechendere Namen, wie _Mutter(And - if we are at it, the name should not be
member/2
but rather member_of/2
, member_oflist/2
,
member_list/2
or if you insist member_/2
.)
_
.
equal(_X,_X). ! ! Mit _ beginnende Variablen sollen nur genau einmal vorkommen:[_X]
:- kind_von(vater,X). ! ! Bitte beachten Sie, daß Variablen in Prolog mit einem Großbuchstaben bzw. mit _ beginnen. Hier steht das Atom :vater: das wahrscheinlich eine Variable sein soll.: Also großgeschrieben werden soll.
\+/1
in assertions
:- \+ p(X), g(X). ! \+ darf hier nicht verwendet werden. \Hinweis{Konsistenzprüfung}
:- kind_von(kind_von(A),B). ! Bitte beachten Sie, daß Argumente von Zielen Terme sind, aber keine anderen Ziele.
a(X) :- X is Y, X = Y. ! ! Im Arithmetikprädikat :is/2: kommt die Variable :Y: vor. Sie wird jedoch IMMER eine freie Variable sein. Es wird also immer hier ein Fehler bei einem Beweis auftreten.Similarily many problems with setof/3 are detected.
is_baum(_Baum). ! Dieses Faktum ist sicher nicht richtig. Was bedeutet dieses Faktum? Alles ist ein Baum? vgl. :- is_baum(napoleon_III).