% Logik og sprog, Modul 2, datalogi RUC Henning Christiansen % % Notat til forelūsning om Prologs % videregŒrnde faciliteter % % Dette er en kommenteret kildetekst med % programeksempler benyttet under forelūsningen % - nogle eksempler hentet fra Bratko's bog. % Denne tekst: (c) 2000, Henning Christiansen %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Grundbegreber i Prologs syntax % ::= % | % | % % ::= a | b | muuh | 'X' | '.' | ... % % ::= 0 | 1 | -1 | 4.13 | ... % % ::= X | A | Muuh | _a | _ | ... % % ::= (, ..., ) % ::= | % % ::= | % % ::= . % % ::= :- , ... , . % ::= ... % ::= , ... , . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Grundbegreber i Prologs % deklarative semantik % % 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). % .... vi vender tilbage en mere % effektiv implmentation af lūngdeprūdikatet % nŒr vi har det rette vūrktŋj... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Cut og backtracking loen(S, 0):- student(S), !. loen(S, 100000). student(a). %%%%%%%%%%%%%%%%%%%% 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