Prolog. Alguns programes d’exemple

  • La «família» que podeu baixar-vos del fitxer familia.pl:

    % mare(F,M) "la mare de F és M"
    mare(joan,angela).
    mare(maria,angela).
    
    % germana(A,G) "la germana d'A és G"
    germana(angela,cris).
    germana(angela,judit).
    
    % tia(N,T) "la tia de N és T"
    tia(N,T) :- mare(N,M), germana(M,T).
    
  • Algunes consultes en «família»:

    ?- tia(N,T).
    
    ?- tia(N,judit).
    
    ?- tia(joan,T).
    
    ?- tia(joan,judit).
    
  • Termes, variables, unificació, llistes:

    ?- f(X,a) = f(b,Y).
    
    ?- f(f(X),a) = f(Y,Y).
    
    ?- f(f(X),a) \= f(Y,Y).
    
    ?- f(f(X),a) = f(Y,Z).
    
    ?- [X,Y|L] = [a,b,c].
    
    ?- [X|L] = [Y,Z,a,g(b),c].
    

    Consulteu unificació de termes.

  • Programes amb «llistes» que podeu baixar-vos del fitxer llistes.pl:

    % pert(E,L) "l'element E pertany a la llista L"
    
    % concat(L1,L2,L3) "la concatenació les llistes L1 i L2 és la llista L3"
    
    % pert_amb_resta(E,L,R) "l'element E pertany a la llista L,
    %                        i la llista R conté els elements de L excepte E"
    
  • Consultes amb «llistes»:

    ?- pert(X,[a,b,c]).
    
    ?- concat([a,b,c],[c,d,e],L).
    
    ?- concat(L1,L2,[a,b,c]).
    
    ?- concat([X|L],[a,Y,b,c],[1,2,a,Z,b,Z]).
    
    ?- pert_amb_resta(X,[a,b,c],R).
    

    Nota

    • El predicat pert/2 ja existeix en SWI-Prolog, i es diu member/2

    • El predicat concat/3 ja existeix en SWI-Prolog, i es diu append/3

    • El predicat pert_amb_resta/3 ja existeix en SWI-Prolog, i es diu select/3

    Consulteu la library(lists) de SWI-Prolog i els predicats predefinits amb llistes.

  • Aspectes extralògics de Prolog: aritmètica predefinida.

    ?- X = 2+3.
    
    ?- X is 2+3.
    
    ?- X is 1/3.
    
    ?- X is (7+3) mod 2.
    
    ?- 3 is 3+2.
    
    ?- 2 is X+1.
    
    ?- X is f(1).
    
    ?- X = 3*2, Y is X+1.
    
    ?- X = 3*2, Y = 1+1, Y is X//3.
    

    Consulteu els predicats aritmètics de SWI-Prolog.

  • Alguns predicats que fan servir aritmètica predefinida, i que teniu al fitxer arit.pl:

    % mida(L,N) "la mida de la llista L és N"
    
    % fact(N,F) "el factorial de N és F" (VERSIÓ 0)
    
    % factors_primers(N,L) "la llista de factors primers de N és L"
    
  • Combinatòria, que teniu al fitxer comb.pl:

    % permutacio(L,P) "P és una permutació de L"
    
    % subcjt(L,S) "S és un subconjunt de L"
    
    % xifres(L,N) "a partir dels números de la llista L es forma una expressió
    %              amb sumes, restes i productes que s'avalua al valor N"
    
    % expressió(L,E) "E és una expressió formada amb les xifres de la llista L"
    

    Nota

    • El predicat permutacio/2 ja existeix en SWI-Prolog i es diu permutation/2

    Aquest programa simplement genera i comprova totes les expressions formades a partir de subconjunts permutats de L.

    ?- xifres( [4,9,8,7,100,4], 380 ).
    
  • Càlcul de derivades, que teniu al fitxer deriv.pl:

    % der(E,X,D) "la derivada de la expressió E respecte de la variable X és la expressió D"
    
  • Simplificació d’expressions, que teniu al fitxer simplif.pl:

    % simplifica(E,E1) "L'expressió E1 és la simplificació final de l'expressió E"
    
    % unPas(E,E1) "L'expressio E1 és l'expressió E simplificada un pas"
    

    Podem fer servir aquests dos programes, per exemple, així:

    ?- der(2*x*x + 3*x, x, D), simplifica(D,D1).