eder@kiwi:~$ gprolog
GNU Prolog 1.4.5 (64 bits)
Compiled Feb  3 2020, 15:00:59 with gcc
By Daniel Diaz
Copyright (C) 1999-2020 Daniel Diaz
| ?- sort([2,3,2],[2,3]).

(1 ms) yes
| ?- sort([2,3,2],[3,2]).

no
| ?- sort([2,3,2],[2,4]).

no
| ?- sort([2,3,2],L).

L = [2,3]

yes
| ?- msort([2,3,2],L).

L = [2,2,3]

yes
| ?- integer(-3).

yes
| ?- integer(2.3).

no
| ?- integer(a).

no
| ?- between(3,7,X).

X = 3 ? ;

X = 4 ? ;

X = 5 ? ;

X = 6 ? ;

X = 7

yes
| ?- findall(X, between(3,7,X), Xs).

Xs = [3,4,5,6,7]

yes
| ?- findall(X, between(3,7,X), Xs), sort(Xs,S).

S = [3,4,5,6,7]
Xs = [3,4,5,6,7]

yes
| ?- findall(X, (between(2,4,Y), between(4,8,Z), X is Y+Z), Xs).

Xs = [6,7,8,9,10,7,8,9,10,11,8,9,10,11,12]

| ?- findall(X, (between(2,4,Y), between(4,8,Z), X is Y+Z), Xs), sort(Xs,S).

S = [6,7,8,9,10,11,12]
Xs = [6,7,8,9,10,7,8,9,10,11,8,9,10,11,12]
{Y+Z | Y zwischen 2 und 4 sowie Z zwischen 4 und 8}

| ?- findall(Xplus1, (member(X,[2,6,9]), Xplus1 is X+1), L), sort(L,S).

L = [3,7,10]
S = [3,7,10]

yes
| ?- [2,3,2] = [3,2].

no


                                                   3.5.2021

?- current_op(Praezendenz,Spezifikator,+).
...
Praezendenz = 500
Spezifikator = yfx

?- current_op(Praezendenz,Spezifikator,*).
Praezendenz = 400
Spezifikator = yfx

?- write_canonical(2*3+4).
+(*(2,3),4)

?- 2*3+4 = +(*(2,3),4).
yes

Strukturbaum des Terms 2*3+4:

      +
     / \
    /   \
   *     4
  / \
 /   \
2     3

?- current_op(Praezendenz,Spezifikator,-).

Praezendenz = 200
Spezifikator = fy ? ;

Praezendenz = 500
Spezifikator = yfx

?- write_canonical(2-3-4).
-(-(2,3),4)

?- 2-3-4 = -(-(2,3),4).
yes

Strukturbaum des Terms 2-3-4:

      -
     / \
    /   \
   -     4
  / \
 /   \
2     3

?- (2*3)+(4*5) = 2*3+4*5.
yes

?- (2+3)*4 = 2+3*4.
no

?- op(400,xfy,f).
yes

?- write_canonical(2 f 3 f 4).
f(2,f(3,4))

?- X = f(2,f(3,4)).
X = 2 f 3 f 4

?- X = (2 f (3 f 4)).
X = 2 f 3 f 4

?- 2 f 3 f 4 = (2 f (3 f 4)).
yes


Arithmetik und Vergleichspraedikate in Prolog:

?- 2*3 =:= 1+5.
yes

?- =:=(2*3,1+5).
yes

?- X*2 =:= 1+5.
uncaught exception: error(instantiation_error,(=:=)/2)

?- X is +(2,3).
X = 5

?- X is 2+3.
X = 5

?- X is 2+Y.
uncaught exception: error(instantiation_error,(is)/2)

?- 1.0 is 3-2.
no

?- 1.0 =:= 3-2.
yes

?- 1.0 = 1.
no

?- 1.0 =:= 1.
yes

?- X =:= 3-2.
uncaught exception: error(instantiation_error,(=:=)/2)

?- 2*5 < 7+8.
yes

?- 2*5 =< 7+8.
yes

?- 2*5 > 7+8. 
no

?- 2*5 >= 7+8.
no

?- 2*5 =:= 7+8.
no

?- 2*5 =\= 7+8.
yes

?- 2*5 <= 7+8.         In Prolog wird kleinergleich =<, nicht <= geschrieben.
uncaught exception: error(syntax_error('user_input:1 (char:189) . or operator expected after expression'),read_term/3)

?- 2*3 = *(2,3).
yes

?- 2*3 = 6.            = ist Unifikation von Termen.
no

?- 2*3 == *(2,3).      == ist identische Gleichheit von Termen.
yes


Hinweis zum Proseminar, Blatt 5:
Die Struktur eines komplizierten Terms wie in Aufgabe 12 ist oft auf
den ersten Blick schwer zu erkennen. Sie koennen ihn so analysieren:

?- functor([a,b,[c,[d,e],f],[[g]],h-i+j*k], F, N).
F = '.'
N = 2

zeigt, dass der Punkt '.' der Hauptfunktor ist und seine Stelligkeit 2.
Die Wurzel des Strukturbaumes muss also mit einem Punkt markiert sein.
Die unmittelbaren Teilterme koennen Sie dann so bekommen:

?- .(T1,T2) = [a,b,[c,[d,e],f],[[g]],h-i+j*k].
T1 = a
T2 = [b,[c,[d,e],f],[[g]],h-i+j*k]

oder Sie verwenden das Programm teilterm.pl aus der Vorlesung:

?- [teilterm].
?- unmittelbarer_Teilterm(U, [a,b,[c,[d,e],f],[[g]],h-i+j*k]).
U = a ;
U = [b,[c,[d,e],f],[[g]],h-i+j*k]
?-

So koennen Sie sich vom gegebenen Term t zuerst zu den unmittelbaren
Teiltermen und dann schrittweise zu immer kleineren Teiltermen
hangeln. Ebenso koennen Sie sich im Strukturbaum von t von der Wurzel
des Baumes aus schrittweise bis zu den Blaettern hangeln. Sie koennen
dann umgekehrt den Strukturbaum konstruieren, indem Sie nacheinander
die Strukturbaeume der Teilterme konstruieren, angefangen von den
kleinsten Teiltermen bis zum Term t selbst.
