1. Definir una regla unaria, cuyo sujeto sea un número natural N, que es verdadera cuando N es primo.
domains numero=integer
predicates nondeterm primo(numero) nondeterm div_primo(numero,numero,numero)
clauses div_primo(N,0,0):-N>0. div_primo(N,M,C):-N>0,M>0,Z=N mod M,Z=0,M1=M- 1,div_primo(N,M1,C1),C=C1+1. div_primo(N,M,C):-N>0,M>0,Z=N mod M,Z<>0,M1=M-1,div_primo(N,M1,C).
primo(N):-div_primo(N,N,K),K=2,write("Es Primo"),nl. primo(N):-div_primo(N,N,K),K>2,write("No es Primo"),nl. goal primo(2).
2. Escribir una regla binaria que relacione dos números enteros con su producto,en base a las siguientes definiciones.
domains numero=integer predicates nondeterm producto(numero,numero) clauses producto(A,B):- B=1,P=A,write(P),nl. producto(A,B):- B>1,P=(A*(B-1)+A),write(P),nl. goal producto(3,4).
3. Escribir una regla binaria cuyos sujetos son dos números A y B q sea verdadera cuando se muestran por pantalla todos los números que se encuentran entre A y B, siendo A menor que B.
domains numero=integer predicates nondeterm esta_entre(numero,numero)
1
clauses esta_entre(A,B):-A=B,write(A),nl. esta_entre(A,B):-A<B,M=A+1,write(A),nl,esta_entre(M,B).
goal esta_entre(3,7).
4. Definir una regla unaria cuyo sujeto sea un número natural N, y que sea verdadera cuando se muestren por pantalla todos los divisores de N, incluidos la unidad y él mismo.
domains numero=integer
predicates nondeterm divisores(numero) nondeterm divisor(numero,numero) nondeterm divisor2(numero,numero)
clauses divisor(N1,N2):-Y=N2 mod N1, Y=0, N1>0, N1<=N2. divisor2(N,N2):-N2=N+1,N>0. divisor2(N,N1):-N2=N1+1,divisor(N1,N),write(N1),nl,divisor2(N,N2). divisor2(N,N1):-N1<=N,N2=N1+1,divisor2(N,N2). divisores(N):-divisor2(N,1).goal divisores(24).
5. Definir una regla unaria cuyo sujeto sea un numero natural N, y que sea verdadera cuando se muestran por pantalla todos los divisores de N, distintos de 1 y N.
domainsnumero=integerpredicates
nondeterm divisor(numero,numero).nondeterm divisores(numero).
clausesdivisor(N,Y):-Y<N-1,Y1=Y+1,D=N mod
Y1,D=0,write(Y1),nl,divisor(N,Y1).divisor(N,Y):-Y<N-1,Y1=Y+1,D=N mod
Y1,D<>0,divisor(N,Y1).
divisores(N):-divisor(N,1).goal
divisores(12).
2
6. Escribir la definición de una regla que relacione un número natural con la suma de sus divisores.
domains numero=integer
predicatesnondeterm sumadiv(numero,numero)
nondeterm suma_divisor(numero,numero,numero)clauses
suma_divisor(N,0,0):-N>0.suma_divisor(N,D,S):-N>0,D<>0,Z=N mod D,Z=0,D1=D-
1,suma_divisor(N,D1,S1),S=S1+D.suma_divisor(N,D,S):-N>0,D<>0,Z=N mod D,Z>0,D1=D-
1,suma_divisor(N,D1,S).
sumadiv(N,S):-suma_divisor(N,N,S).goal
sumadiv(10,X).
7. Definir una regla que vincule un número N con los números perfectos menores o iguales que N. Un número es perfecto si la suma de sus divisores, excepto él mismo, es igual al propio número.
Predicatesnondeterm sumadiv(integer,integer)nondeterm suma_divisor(integer,integer,integer)nondeterm perfecto(integer)nondeterm perfectos(integer)
clausessuma_divisor(N,0,0):-N>0.suma_divisor(N,D,S):-N>0,D<>0,Z=N mod D,Z=0,D1=D-
1,suma_divisor(N,D1,S1),S=S1+D.suma_divisor(N,D,S):-N>0,D<>0,Z=N mod D,Z>0,D1=D-
1,suma_divisor(N,D1,S).sumadiv(N,S):-suma_divisor(N,N,S).
perfectos(X):-X>0,perfecto(X),write(X),nl,X1=X-1,perfectos(X1); X>0,not(perfecto(X)),X1=X-1,perfectos (X1). perfecto(X):-sumadiv(X,Y),Y1=Y-X,Y1=X. goal
perfectos(100).
8. Definir una regla binaria que sea verdadera cuando dos números naturales sean amigos. Dos números son amigos si la suma de los divisores del primero, excepto el mismo, es igual al segundo y viceversa.
3
predicates
calcula_divisores(integer, integer, integer)
sumadiv(integer,integer)
amigos(integer,integer)clauses
calcula_divisores(_, 1, 0):-!.
calcula_divisores(N, D, Suma):-Divisor=D-1, N mod Divisor=0, calcula_divisores(N, Divisor, Suma1), Suma=Suma1+Divisor,!.
calcula_divisores(N, D, Suma):-Divisor=D-1, calcula_divisores(N, Divisor, Suma).
%sumadiv(N,X):-calcula_divisores(N, N, Suma),X = Suma + N,write(X),nl,!.
sumadiv(N,M):-calcula_divisores(N, N, Suma1),calcula_divisores(M, M, Suma2),X = Suma1 + N,Y = Suma2 + M,amigos(X,Y),!.
amigos(X,Y):-X=Y.
goal
%write("Dame un número: "), readint(N),sumadiv(N).
sumadiv(284,220).
4
Top Related