Guest User

Untitled

a guest
Dec 11th, 2018
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.66 KB | None | 0 0
  1. /*1 - Definir um predicado que faça a inserção de um elemento na primeira posição de uma lista */
  2.  
  3. inserePrimeira(X,L,[X|L]).
  4.  
  5. /*2 - Definir um predicado que faça a inserção de um elemento na posição N da lista*/
  6.  
  7. insereN(X,1,L,[X|L]).
  8. insereN(X,N,[C|L],[C|R]):-N1 is N-1, insereN(X,N1,L,R).
  9. /* Lado direito é sempre estático (resposta) */
  10.  
  11.  
  12. /*3 - Definir um predicado que converta todos os valores de uma lista em seus valores absolutos*/
  13.  
  14. val_absoluto_lista([],[]).
  15. val_absoluto_lista([C|L],[A|R]) :- abs(C,A), val_absoluto_lista(L,R).
  16.  
  17.  
  18. /*4 - Escreva um predicado para encontrar o maior valor da lista*/
  19.  
  20. maior_lista([R],R).
  21. maior_lista([C|L],R) :- maior_lista(L,A), (A > C -> R = A; R = C).
  22. /* confere a calda compara se o maior da calda é maior que a cabeça */
  23.  
  24.  
  25. /*5- Definir o predicado ultimo(Elem, Lista) que encontra o último elemento Elem de uma lista Lista. */
  26.  
  27. ultimo(R,[R]).
  28. ultimo(R,[_|L]) :- ultimo(R,L).
  29.  
  30.  
  31. /*6 - Verificar se dois elementos são consecutivos em uma lista. */
  32.  
  33. /* consecutivos([L],N) */
  34. /* consecutivos([C|L],N) :- consecutivos(L,A), ( N == A -> ) */
  35.  
  36. /*7 - Somar elementos de uma lista numérica*/
  37.  
  38. somar_lista([],0).
  39. somar_lista([C|L],S) :- somar_lista(L,A), (S is A+C).
  40.  
  41. /*8 - Encontra n-ésimo elemento de uma lista*/
  42.  
  43. encontra_n([],_,_).
  44. encontra_n([C|_],1,C).
  45. encontra_n([_|L],N,R) :- N1 is N-1, encontra_n(L,N1,R).
  46.  
  47. /*9 - Determinar o número de elementos de uma lista*/
  48.  
  49. tamanho_lista([],0).
  50. tamanho_lista([_|L],N) :- tamanho_lista(L,N1), N is N1+1.
  51.  
  52. /*10 - Retirar uma ocorrência de uma lista*/
  53.  
  54. remove_x1(X,[X|T], T).
  55. remove_x1(X,[C|T], [C|T1]) :- remove_x1(X,T,T1).
  56.  
  57. /*11 - Retirar todas as ocorrências de uma lista*/
  58.  
  59. remove_x(_,[],[]).
  60. remove_x(X,[X|T], L) :- remove_x(X,T,L).
  61. remove_x(X,[C|T], [C|T1]) :- X \= C, remove_x(X,T,T1).
  62.  
  63. /*12 - Substituir o elemento de uma lista por outro elemento*/
  64.  
  65. /* Na posição */
  66. subst_n(X,1,[_|L],[X|L]).
  67. subst_n(X,N,[C|L],[C|R]) :- N1 is N-1, subst_n(X,N1,L,R).
  68.  
  69. /* por elemento */
  70. subst_x(_,_,[],[]).
  71. subst_x(X,Y,[X|L],[Y|L1]) :- subst_x(X,Y,L,L1).
  72. subst_x(X,Y,[Z|L],[Z|L1]) :- subst_x(X,Y,L,L1).
  73.  
  74. /*13 - Dividir uma lista numérica em duas sublistas <= e >*/
  75.  
  76. div_lista(_,[],[],[]).
  77. div_lista(X,[H|T],[H|L],R) :- H =< X, div_lista(X,T,L,R).
  78. div_lista(X,[H|T],L,[H|R]) :- H > X, div_lista(X,T,L,R).
  79.  
  80.  
  81. /* Leitura e escrita */
  82.  
  83. /* write(String) */
  84. /* read(Nome_Var) */
  85.  
  86. /* Cut '!' -> Se conseguir unificar não executa mais nada */
  87.  
  88. /*Maior*/
  89. maior(X,Y,X) :- write('1'),X>=Y,!.
  90. maior(X,Y,Y) :- write('2'),X<Y.
  91.  
  92. /*Fail 'fail' -> obriga a falhar (não precisa do ;)*/
  93.  
  94. /* Ex4 */
  95. conecta(a,b).
  96. conecta(b,c).
  97. conecta(a,d).
  98. conecta(d,c).
  99. conecta(d,e).
  100.  
  101. lista(L):-findall( (X,Y),conecta(X,Y),L ).
  102.  
  103. /* Ex5 - Existe um caminho de X pra Y */
  104.  
  105. /* Caminho direto */
  106. caminho(X,Y,[X,Y]):-conecta(X,Y).
  107. /* X conecta com Z e Z conecta com Y chama recursivo colocando X na cabeça */
  108. caminho(X,Y,[X|L]):-conecta(X,Z),caminho(Z,Y,L).
  109.  
  110. /* Ex6 - Alunos */
  111.  
  112. matricula(andre,pp).
  113. matricula(andre,pi).
  114. matricula(andre,mult).
  115. matricula(andre,vvs).
  116.  
  117. matricula(bob,pp).
  118. matricula(bob,paa).
  119. matricula(bob,lp).
  120. matricula(bob,poo).
  121.  
  122. matricula(carlos,ipo).
  123. matricula(carlos,grafos).
  124. matricula(carlos,mult).
  125. matricula(carlos,bd).
  126.  
  127. matricula(dado,grafos).
  128. matricula(dado,pp).
  129. matricula(dado,lp).
  130. matricula(dado,c1).
  131.  
  132. nota(andre,pp , 5).
  133. nota(andre,pi , 5).
  134. nota(andre,mult , 5).
  135. nota(andre,vvs, 5).
  136.  
  137. nota(bob,pp ,5).
  138. nota(bob,paa,8).
  139. nota(bob,lp ,9).
  140. nota(bob,poo,6).
  141.  
  142. nota(carlos,ipo,9).
  143. nota(carlos,grafos ,4).
  144. nota(carlos,mult ,4).
  145. nota(carlos,bd ,5).
  146.  
  147. nota(dado,grafos ,4).
  148. nota(dado,pp,7).
  149. nota(dado,lp,8).
  150. nota(dado,c1,9).
  151.  
  152.  
  153.  
  154. /*disciplinas(Aluno,L):-*/
  155. disciplinas(Aluno,L):-bagof( Materia, matricula(Aluno,Materia), L).
  156. /*Lista de disciplinas do aluno*/
  157.  
  158. /*alunos(Disc,L):-*/
  159. /* Lista alunos na disciplina */
  160. alunos(Disc,L):-bagof( Aluno, matricula(Aluno,Disc),L ).
  161.  
  162.  
  163. /*media_disc(Disc,M):-*/
  164. /* Média de notas na disciplina */
  165. media_disc(Disc,F) :- findall(N,nota(_,Disc,N),M), tamanho_lista(M,T), somar_lista(M,R), F is R/T.
  166.  
  167.  
  168. /*media_aluno(Aluno,M):-*/
  169. /* Media de notas do aluno */
  170. media_aluno(Aluno,F) :- findall(N,nota(Aluno,_,N),M), tamanho_lista(M,T), somar_lista(M,R), F is R/T.
  171.  
  172. /*reprovados(L):-*/
  173. /* lista de alunos reprovados em alguma disciplina. L=[(aluno,disc,nota)] */
  174. reprovados(L) :-
  175. findall((Aluno,Disciplina,Nota),(nota(Aluno,Disciplina,Nota), Nota < 5),L).
  176.  
  177.  
  178. /* não converte pra asc */
  179. /* set_prolog_flag(double_quotes,chars) */
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186. /*Gramática*/
  187. /* set_prolog_flag(double_quotes,chars). */
  188.  
  189. reg --> ("a";"b";"c";"d"),"x". /* ax - bx - cx - ... */
  190. bin --> ("0";"1");("0";"1"),bin.
  191.  
  192. arep --> ("";"a";arep).
  193. brep --> ("";"b";brep).
  194.  
  195. aba --> "a",brep,"a". /* <aba> -> a {b}+ a */
  196.  
  197.  
  198. ab --> "ab";("a",ab,"b"). /* <ab> -> {a}+{b}+ */
  199.  
  200. ab2 --> brep2,"a",arep2,"b".
  201. brep2 --> "b";("b",brep2).
  202. arep2 --> "a";("a",arep2).
  203.  
  204. /* swipl no terminar para abrir o prolog */
  205. /*abrir arquivo ['nome do arquivo.pl'].*/
  206. /* para gramaticas */
  207. /* set_prolog_flag(double_quotes,chars). para representar os caracteres como letras e nao pelo codigo ASCII das letras. */
  208.  
  209. /* Calcula MDC entre dois números inteiros.*/
  210. mdc(X,0,Z) :- !, Z = X.
  211. mdc(X,Y,Z) :- R is X mod Y, mdc(Y,R,Z).
  212.  
  213. /* Lista é palíndromo.*/
  214. pali(X) :- reversa(X,X).
  215.  
  216. reversa([],[]).
  217. reversa([X|Y],Z) :- reversa(Y,W), append(W,[X],Z).
  218.  
  219. append([],L,L).
  220. append([X|Y],Z,[X|W]) :- append(Y,Z,W).
  221.  
  222. /* Duplica elementos da lista. Exemplo: recebe [a,b,c] retorna [a,a,b,b,c,c].*/
  223. duplica([],[]).
  224. duplica([X|Y],[X,X|Z]) :- duplica(Y,Z).
  225.  
  226. /* Intervalo(i,j) que imprime os números naturais de i a j inclusive.*/
  227. intervalo(I,J) :- I > J, !, fail.
  228. intervalo(I,J) :- write(I), nl, I1 is I+1, intervalo(I1,J).
  229.  
  230. /* Fatorial*/
  231. fatorial(0,1).
  232. fatorial(N,F): N>0, N1 is N-1, fatorial(N1,F1), F is N * F1.
  233.  
  234. fatorial(X,1) :- X > 0 , X =:= 0 ; X =:= 1.
  235. fatorial(X,R) :- X > 0 , X1 is (X-1) , fatorial(X1, R1), R is (R1*X).
  236.  
  237. /* Ordenação de uma lista com o algoritmo insertion sort*/
  238. isort([],[]).
  239. isort([H|T],L) :- isort(T,T1), ins(H,T1,L).
  240. ins(X,[],[X]).
  241. ins(X,[Y|Ys],[Y|Zs]) :- X > Y, ins(X,Ys,Zs).
  242. ins(X,[Y|Ys],[X,Y|Ys]) :- X =< Y.
  243.  
  244. /* Apaga todas as ocorrências de um dado elemento de uma lista*/
  245. apaga([H|T],H,L) :- apaga(T,H,L).
  246. apaga([H|T],X,[H|L]) :- H \== X, apaga(T,X,L).
  247. apaga([],_,[]).
  248.  
  249. /* subtermo(T1,T2) testa se T1 é subtermo de T2 */
  250. subtermo(T1,T2) :- T1 == T2.
  251. subtermo(S,T) :- compound(T), functor(T,F,N), subtermo(N,S,T).
  252. subtermo(N,S,T) :- N>1, N1 is N-1, subtermo(N1,S,T).
  253. subtermo(N,S,T) :- arg(N,T,A), subtermo(S,A).
  254.  
  255. /* mínimo */
  256. minimo(X,Y,Y) :- X >= Y.
  257. minimo(X,Y,X) :- X < Y.
  258.  
  259. /* progenitor */
  260. progenitor(A,B) :- pai(A,B).
  261. progenitor(A,B) :- mae(A,B).
  262. avo(X,Y) :- progenitor(X,Z), progenitor(Z,Y).
  263. progenitor(A,B) :- pai(A,B) ; mae(A,B).
  264. tio(X,Y) :- (pai(A,Y) ; mae(A,Y)), irmao(X,A).
  265.  
  266. /* Considere o seguinte código */
  267. amigo(ana,rui).
  268. amigo(pedro,rui).
  269. amigo(maria,helena).
  270. amigo(pedro,ana).
  271. amigo(maria,rui).
  272. gosta(ana,cinema).
  273. gosta(ana,pintura).
  274. gosta(ana,ler).
  275. gosta(rui,ler).
  276. gosta(rui,musica).
  277. gosta(maria,ler).
  278. gosta(pedro,pintura).
  279. gosta(pedro,ler).
  280. compativeis(A,B) :- amigo(A,B), gosta(A,X), gosta(B,X).
  281. compativeis(A,B) :- amigo(B,A), gosta(A,X), gosta(B,X).
  282.  
  283. /* findall, bagof e setof */
  284. /*
  285. findall(X,compativeis(ana,X),L).
  286. L = [rui,pedro,pedro]
  287. */
  288. /*
  289. bagof(X,compativeis(ana,X),L).
  290. L = [rui,pedro,pedro]
  291. */
  292. /*
  293. setof(X,compativeis(ana,X),L).
  294. L = [pedro,rui]
  295. */
  296.  
  297. /* Reverter uma lista */
  298. /* reverse([1,3,5,7,9],X). */
  299.  
  300. /* ultimo elemento de uma lista */
  301. ultimo([Elem],Elem).
  302. ultimo([_|Cauda],Elem) :- ultimo(Cauda,Elem).
  303.  
  304. /* soma dos elementos de uma lista */
  305. soma([],0).
  306. soma([Elem|Cauda],S) :- soma(Cauda,S1), S is S1+Elem.
  307.  
  308. /* n-ésimo elemento de uma lista */
  309. n_esimo(1,Elem,[Elem|_]).
  310. n_esimo(N,Elem,[_|Cauda]) :- n_esimo(M,Elem,Cauda), N is M+1.
  311.  
  312. /* numero de elementos de uma lista */
  313. no_elem([],0).
  314. no_elem([Elem|Cauda],N) :- no_elem(Cauda,N1), N is N1+1.
  315.  
  316. /* maior elemento de uma lista numerica */
  317. max([X,Y|Cauda],Max) :- X >= Y, !, max([X|Cauda],Max).
  318. max([X,Y|Cauda],Max) :- max([Y|Cauda],Max).
  319.  
  320. /* Usando a base ao lado, defina a regra: uma pessoa pode roubar algo se essa pessoa é um ladrão e ela gosta de um objeto.
  321. Qual a resposta dada por Prolog à pergunta: João rouba o que? Como seria a pergunta?*/
  322.  
  323. ladrao(joao).
  324. ladrao(pedro).
  325. gosta(maria,comida).
  326. gosta(maria,vinho).
  327. gosta(joao,rubi).
  328. gosta(joao,X):- gosta(X,vinho).
  329.  
  330. roubo(X,Y):- ladrao(X), gosta(X,Y).
  331.  
  332. /*Exercício 2*/
  333.  
  334. /* progenitor(X,Y) significa que X é progenitor de Y */
  335. progenitor(pedro, carlos).
  336. progenitor(pedro, ana).
  337. progenitor(carlos,antonio).
  338. progenitor(carlos,maria).
  339. progenitor(joana,antonio).
  340. progenitor(joana,maria).
  341. progenitor(joana,ana).
  342.  
  343. /* definindo alguns fatos sobre o sexo */
  344. homem(pedro).
  345. homem(carlos).
  346. homem(antonio).
  347. mulher(ana).
  348. mulher(maria).
  349.  
  350. /* pai(X,Y) significa que X é pai de Y */
  351. pai(X,Y):-progenitor(X,Y) , homem(X).
  352.  
  353. /* mae(X,Y) significa que X é mãe de Y */
  354. mae(X,Y):-progenitor(X,Y), mulher(X).
  355.  
  356. irma(X,Y) :- pai(P,X), pai(P,Y), mulher(Y), X \= Y.
  357. irma(X,Y) :- mae(P,X), mae(P,Y), mulher(Y), X \= Y.
  358.  
  359. /*Exercício 3*/
  360. /*Para a árvore genealógica do exemplo, defina as regras:
  361. filho, filha
  362. avo, avó
  363. irmão, irmã
  364. primo, prima
  365. tio, tia
  366. sobrinho, sobrinha*/
  367.  
  368.  
  369. filho(X,Y) :- progenitor(Y,X), homem(X).
  370. filha(X,Y) :- progenitor(Y,X), mulher(X).
  371. filhos(X,Y) :- progenitor(X,Y).
  372.  
  373.  
  374. avo(X,Y) :- pai(P,X), pai(Y,P).
  375. avoh(X,Y) :- mae(P,X), mae(Y,P).
  376.  
  377. irma(X,Y) :- progenitor(P,X), progenitor(P,Y), mulher(Y), X \= Y.
  378. irmao(X,Y) :- progenitor(P,X), progenitor(P,Y), homem(Y), X \= Y.
  379.  
  380. tio(X,Y) :- progenitor(P,Y), irmao(X,P).
  381. tia(X,Y) :- progenitor(P,Y), irma(X,P).
  382.  
  383. primo(X,Y) :- homem(X), progenitor(T,X), progenitor(P,Y), irmao(T,P) ; irma(T,P).
  384. prima(X,Y) :- mulher(X), progenitor(T,X), progenitor(P,Y), irmao(T,P) ; irma(T,P).
  385.  
  386. sobrinho(X,Y) :- tio(Y,X) ; tia(Y,X).
  387. sobrinha(X,Y) :- tio(Y,X) ; tia(Y,X).
  388.  
  389. casou(joao, maria, dia(5, maio, 2000)).
  390. casou(jose,claudia, dia(11,novembro,1950)).
  391. casou(andre, fernanda, dia(11, agosto, 1960)).
  392. casou(adriano, claudia, dia(15, outubro, 1973)).
  393.  
  394. /*
  395. casou(_,maria,X).
  396. casou(andre,_, dia(_,X,_)).
  397. casou(adriano,_,dia(_,_,X)) , casou(Y,H,dia(_,_,Z)), Z =< X.
  398. casou(A,B,dia(_,_,X)) , X >= 1984.
  399. casou(A,B,dia(_,_,X)) , X =< 1990, X >= 1960.
  400. */
  401.  
  402. /* bicharada */
  403. canario(piupiu).
  404. peixe(nemo).
  405. tubarao(tutu).
  406. vaca(mimosa).
  407. morcego(vamp).
  408. avestruz(xica).
  409. salmao(alfred).
  410. peixes(X) :- peixe(X) ; tubarao(X) ; salmao(X).
  411. passaros(X) :- canario(X) ; avestruz(X).
  412. mamifero(X) :- vaca(X) ; morcego(X).
  413. animal(X) :- peixes(X) ; passaros(X) ; mamiferos(X).
  414. delicia(X) :- salmao(X).
  415. cor(X,Y) :- canario(X), Y = amarelo.
  416. grande(X) :- avestruz(X).
  417. anda(X) :- avestruz(X) ; (mamifero(X), not(morcego(X))).
  418. alimento(X) :- vaca(X) ; delicia(X).
  419. pele(X) :- animal(X).
  420. nadadeira(X) :- peixes(X).
  421. nada(X) :- peixes(X).
  422. asas(X) :- passaros(X) , not(avestruz(X)) ; morcego(X).
  423. voa(X) :- passaros(X) , not(avestruz(X)) ; morcego(X).
  424. ovos(X) :- passaros(X) ; peixes(X), not(tubarao(X)).
  425.  
  426. /*Exemplo de Lista*/
  427.  
  428. lista1([[], dead(z), [2, [b,c]], [], Z, [2, [b,c]]]).
  429.  
  430. /*Cabeça e Calda*/
  431.  
  432. lista1([X|Y]).
  433.  
  434.  
  435. /*Concatenação de Listas*/
  436.  
  437. conc([ ], L, L).
  438. conc(L, [ ], L).
  439. conc( [X | L1], L2, [X | L3]) :- conc(L1, L2, L3).
  440.  
  441. /*Definir um predicado que faça a inserção de um elemento na primeira posição de uma lista*/
  442.  
  443. insere(X,L, [X|L]).
  444.  
  445. /*Definir um predicado que converta todos os valores de uma lista em seus valores absolutos*/
  446.  
  447. labs([],[]).
  448. labs([C|L],[Y|L1]) :- abs(C,Y), labs(L,L1).
  449.  
  450.  
  451. /*Escreva um predicado para encontrar o maior valor da lista*/
  452.  
  453. maior([C] , C).
  454. maior([C|L] , Maior) :- maior(L, C1), (C >= C1 -> Maior = C ; Maior = C1).
  455.  
  456. /*Definir o predicado ultimo(Elem, Lista) que encontra o último elemento Elem de uma lista Lista.
  457. - O último elemento de uma lista que tem somente um
  458. elemento é o próprio elemento
  459. - O último elemento de uma lista que tem mais de um elemento
  460. é o último elemento da cauda*/
  461.  
  462. ultimo( listaVazia , []).
  463. ultimo(Resp, [Resp]).
  464. ultimo(Resp, [H|T]) :- ultimo(Resp,T).
  465.  
  466.  
  467. /*Definir um predicado que faça a inserção de um elemento na n-esima posição de uma lista*/
  468.  
  469. /*inserePosN(Elem, [], _ , [Elem]).*/
  470. inserePosN(Elem, L , 0 , [Elem|L]).
  471. inserePosN(Elem, [H|T], Pos, [H|Resp1]) :- Pos1 is Pos-1, inserePosN(Elem, T, Pos1, Resp1).
  472.  
  473. /* Regras Gramaticais em Prolog*/
  474.  
  475. /* cabeca --> corpo. */
  476.  
  477. reg --> ("a";"b";"c";"d"), "x".
  478.  
  479. bin --> ("0";"1") ; ("0";"1"), bin.
  480.  
  481. binfrac --> bin, (".", bin; "").
  482.  
  483. aba --> "a" , brep, "a".
  484. brep --> ("";"b", brep).
  485.  
  486.  
  487. ss --> "a" , ss , "b" ; "ab".
  488.  
  489. /* Faca um predicado que descreva a seguinte gramatica
  490.  
  491. <expr> -> <termos> {(+|-) <termo>}
  492. <termo> -> <fator> {(*|'/') <fator>}
  493. <fator> -> <exp> { ** <exp>}
  494. <exp> -> '(' <expr> ')' | <id>
  495. <id> -> A | B | C | D
  496.  
  497. */
  498.  
  499. expr --> termo, termo1.
  500. termo1 --> "";("+";"-"), termo, termo1.
  501. termo --> fator, fator1.
  502. fator1 --> ""; ("*";"/"), fator, fator1.
  503. fator --> exp, exp1.
  504. exp1 --> "" ; "**", exp, exp1.
  505. exp --> "(", expr, ")" ; id.
  506. id --> "A";"B";"C";"D".
  507.  
  508.  
  509. /*Representar, em Prolog, o problema de verificar se há um caminho entre duas cidades quaisquer calculando a distância entre elas. O predicado deve retornar a lista com o caminho e a distância total percorrida*/
  510.  
  511. conecta(saocarlos,araraquara,50).
  512. conecta(saocarlos,jau,100).
  513. conecta(saocarlos,bauru,170).
  514. conecta(jau,bauru,20).
  515. conecta(bauru,araraquara,130).
  516. conecta(bauru,ribeiraobonito,114).
  517. conecta(ribeiraobonito,araraquara,70).
  518.  
  519.  
  520. caminho(X,Y,[X,Y],Z) :- conecta(X,Y,Z).
  521. caminho(X,Y,[X|L],D) :- conecta(X,Z,D1), caminho(Z,Y,L,D2), D is D1+D2.
  522.  
  523.  
  524. menorDist(X,Y,L,D) :- setof((D1,L1),caminho(X,Y,L1,D1),[(D,L)|_]).
  525.  
  526.  
  527. /*Faca um predicado que ordene uma dada lista usando o insert sort*/
  528.  
  529. menorElem([H],H).
  530. menorElem([H|T],M) :- menorElem(T,M1), (H < M1, M = H ; M =M1).
  531.  
  532. /*
  533. ordena([],[]).
  534. ordena([H|T],L) :- ordena(T,L1), insere(E,L1).
  535.  
  536. insere(X, [H|T],[H|T1]) :- X > Y, insere(X,L,L1), !.
  537. insere(X,L,[X|L]).
  538.  
  539. */
Add Comment
Please, Sign In to add comment