% Modul 2, datalogi RUC Henning Christiansen % % Notat til forelæsning 14/2-2000 % % Dette er en kommenteret kildetekst med % programeksempler benyttet under forelæsningen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Grundbegreber i Prologs syntax % ::= % | % | % % ::= a | b | muuh | 'X' | '.' | ... % % ::= 0 | 1 | -1 | 4.13 | ... % % ::= X | A | Muuh | _a | _ | ... % % ::= (, ..., ) % ::= | % % ::= | % % ::= . % % ::= :- , ... , . % ::= ... % ::= , ... , . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Grundbegreber i Prologs % deklarative semantik % (skitse, uddybes senere) % % En klausul % % p(X):- q(X), r(X). % % forstås som logisk formel % % " X ( p(X) ¨ q(X) /\ r(X) ) % % Betydning af program P = % Betyd(P) = { M | M grundet mål, P |= M} % % hvor "grundet" = variabelfri % og |= er "logisk konsekvens" % % Definition: % En substitution er en afbildning % fra en mgd. variable til termer % % Definition: % Et korrekt svar på forespørgsel M1,...,Mn % til program P er en substitution S, så % % {S(M1), ..., S(Mn)} indholdt i Betyd(P) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Grundbegreber i Prologs % procedurelle semantik % Prologs udførelsesrækkefølge: % ... skitseret ved eksempel: run:- write(runclause1), run1, run2. run:- write(runclause2), run3. run1:- write(run1). run2:- write(run2). run3:- write(run3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Unification % a = b % X = a, a = Y % f(a,X) = f(a,b) ... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Syntaks og semantik, nu til det % % Pragmatiske %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Lister % eksempel på datastruktur % - hjulpet ved syntaktisk sukker. % write([1,2,3,4,5,6]). % write_canonical([1,2,3,4,5,6]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Standard listeprædikater member1(X, [X | _] ). member1(X, [_|L]):- member1(X,L). %%%%%%%%%%%%%%%% append1( [], L, L). append1( [X |L1], L2, [X|L3]):- append1(L1, L2, L3). %%%% % append1([a,b],[c,d], L). % append1(X,Y,[a,b,c]). % append1(_,[*|L],[a,b,*,c,d]). % NB: Husk i Sicstus: :- use_module(library(lists)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Operatorer :- op(700, xfx, sparker). manden sparker hunden. :- op(700, xfx, bider). X bider Y :- Y sparker X. % Rent og skær syntaktisk sukker % ingen ny semantik eller % (essentiel) syntaks. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Liste af prædef. operatorer % current_op(X, Y, Z). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Operatorer, eksempel :- op(700, xfx, er). :- op(100, fx, [en,et]). en mand er et menneske. en kvinde er et menneske. et menneske er et dyr. en ko er et dyr. peter er en mand. X er Z :- X er Y, Y er Z. % peter er X. % peter er et X. % peter er en X. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Aritmetik, et stedbarn % i Prolog % X is +(2, *(2, 3)). % X is 2 + 2 * 3. % X is 2 + Y * 3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Lister og aritmetik len1([], 0). len1([_|L], N):- len1(L, M), N is M + 1. % len1([a,b], L). % len1(X, 7). % len1(X, 1000). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cut og backtracking loen(S, 0):- student(S), !. loen(S, 100000). student(peter). %%%%%%%%%%%%%%%%%%%% likes(mary, X):- snake(X), !, fail. likes(mary, X):- animal(X). snake(boa). animal(X):- snake(X). cow(bea). animal(X):- cow(X). animal(animal). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Forbedret kontrol i % længde-prædikat len2(V, N):- var(V), nonvar(N), !, generate_list(V, N). generate_list([], 0):- !. generate_list([_|L], N):- M is N - 1, generate_list(L, M). len2([], 0). len2([_|L], N):- len2(L, M), N is M + 1. % len2(L, 1000). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 'Eller' »;« % ‹ logisk og procedurelt ab(X):- X = a; X = b. q:- (write(a) ; write(b)), fail. % Eksempel på anvendelse: p(X,Y,Q):- tungberegning(X,Y,Z), (Z = a, Q = b ; Z = aa, Q = c), osv(Q,X,Y,Z). %%% I modsætning til p(X,Y,b):- tungberegning(X,Y,a), osv(b,X,Y,a). p(X,Y,c):- tungberegning(X,Y,aa), osv(c,X,Y,aa). % OBS: dette eksempel kan ikke køre %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Negation i Prolog not(P):- P, !, fail. not(P). % findes i Sicstus som prefiks \+ %%%%% likes1( mary, X):- animal(X), not( snake(X) ). %%%%%. . . er kun næsten det samme som likes2(mary, X):- snake(X), !, fail. likes2(mary, X):- animal(X). %%%%%%%%%%%% % Et fælt eksempel.... p(a). % X = b, \+ p(X). % \+ p(X), X = b. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % »Hvis-så« i Prolog kommentar(X):- write('Resultatet er '), (X =< 5 -> write('ikke ') ; X = 6 -> write('akkurat ') ; X >= 10 -> write('flot ') ; true), write('bestået'). %% NB: ikke omtalt i Bratko