Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
pp:l10 [2020/04/28 14:42]
pdmatei
pp:l10 [2021/05/25 15:44] (current)
roxana_elena.stiuca [Introduction to Prolog programming]
Line 1: Line 1:
 ====== Introduction to Prolog programming ====== ====== Introduction to Prolog programming ======
 +
 +1. Write a query which returns all student names (first and last name), which were born in 1990.
 +
 +(hint: use _ in place of those variables which are not to be shown).
 +
 +2. Write a query which returns all student names which were born before 1990.
 +
 +3. Write a query which returns all student names which were admitted before 2005.
 +
 +4. Define a predicate under18/1 which describes those student ids which had at most 18 years when admitted.
 +
 +Hint: use =<
 +
 +5. Define a predicate which is satisfied if a student Ids failed to pass at least two different lectures.
 +
 +6. Define a predicate which is satisfied if at least one student graduated the lecture.
  
 Consider the following representation of natural numbers (from our last lecture): Consider the following representation of natural numbers (from our last lecture):
Line 7: Line 23:
 </​code>​ </​code>​
  
-1. Implement the predicate ''​add/​3''​ which adds two natural numbers.+7. Implement the predicate ''​add/​3''​ which adds two natural numbers.
  
-2. Implement the predicate ''​minus/​3''​ which substracts one natural number from another. Substraction only needs to work as long as the result is a natural number.+8. Implement the predicate ''​minus/​3''​ which substracts one natural number from another. Substraction only needs to work as long as the result is a natural number.
  
 Consider the following conversion predicates between naturals and Prolog integers. Consider the following conversion predicates between naturals and Prolog integers.
Line 20: Line 36:
 </​code>​ </​code>​
  
-3. Implement ''​min/​3''​ which computes the minimum of two natural numbers. Example usage:+9. Implement ''​min/​3''​ which computes the minimum of two natural numbers. Example usage:
 <code prolog> <code prolog>
 -? toNat(7,X), toNat(4,Y), min(X,Y,R), fromNat(R,​O). -? toNat(7,X), toNat(4,Y), min(X,Y,R), fromNat(R,​O).
 </​code>​ </​code>​
  
-4. Implement ''​max/​3''​ which computes the maximum of two natural numbers.+10. Implement ''​max/​3''​ which computes the maximum of two natural numbers.
  
-5. Implement ''​gt/​2''​ which is satisfied if the first natural number is strictly greater than the second.+11. Implement ''​gt/​2''​ which is satisfied if the first natural number is strictly greater than the second.
  
-6. Implement ''​leq/​2''​ which is satisfied if the first natural number is less than or equal to the second.+12. Implement ''​leq/​2''​ which is satisfied if the first natural number is less than or equal to the second.
  
-7. Implement ''​div/​3''​ which implements the **div** operator.+13. Implement ''​div/​3''​ which implements the **div** operator.
  
-8. Implement ''​mod/​3''​.+14. Implement ''​mod/​3''​.
  
-9. Implement ''​gcd/​3''​ which computes the greatest common divisor of two natural numbers.+15. Implement ''​gcd/​3''​ which computes the greatest common divisor of two natural numbers.
  
-Consider the following representation of lists, expressed by the predicate ''​isList''​ shown below. +==== Appendix ==== 
-<code prolog>​ +
-isList(void). +
-isList(cons(_,​T)) :- isList(T). +
-</​code>​+
  
-10. Implement ''​head/​2''​ and ''​tail/​2''​. +Use the following ​samples for testing: 
- +
-11. Implement ''​size/​2''​ which determines the length of a list as a Prolog integer. +
- +
-12. Implement ''​concat/​3''​ which concatenates two lists. +
- +
-13. Implement ''​reverse/​2''​ which reverses a list. Use accumulators instead of concatenation and an auxiliary predicate. +
- +
-Consider ​the following ​conversion functions from the above list representation to Prolog lists.+
 <code prolog> <code prolog>
-fromList(void,[]). +%student_info(Id,First_Name,​Last_Name,​BirthYear) 
-fromList(cons(H,T),[H|R]:- fromList(T,R). +student_info(9,"​John","​Mike",​1990). 
-</​code>​+student_info(10,"​Andrew","​Jackson",​1990)
 +student_info(11,"​Itachi","​Carter"​,1991)
 +student_info(12,"​Luna","​Ethan",​1989). 
 +student_info(13,"​Everly","​James",​1988).
  
-14Write the predicate ''​toList/​2''​ which converts a Prolog list to our list representation.+%student(Id,​AdmissionYear) 
 +student(9,​2004). 
 +student(10,​2005). 
 +student(11,​2006). 
 +student(12,​2003). 
 +student(13,​2007).
  
-15Implement ''​kelem/​3''​ which determines the k-th element of a Prolog list.+%studies(Id,​Lecture) 
 +studies(9,​aa). 
 +studies(10,​pp). 
 +studies(11,​lfa).
  
-16. Implement ''​rem/​2''​ which removes consecutive duplicates from a Prolog list. +%grade(Id,Lecture,Grade
- +grade(10,pp,4)
-<​code>​ +grade(9,pp,6). 
--? rem([1,1,1,​2,​2,​3,​4,​4],​R). +grade(10,aa,4). 
-R = [1,2,3,4]+grade(11,lfa,10).
-</​code>​ +
-17. Implement ''​flatten/​2''​ which flattens nested Prolog lists. Do not use auxiliary predicates. +
-<​code>​ +
--? flatten([1,2,[3,4,[5]][[6],[]], [7]], R). +
- R = [1,​2,​3,​4,​5,​6,​7] +
-</​code>​ +
-18. Implement ''​pack/​2''​ which groups consecutive duplicates into sublists. +
-<​code>​ +
-?- pack([1,1,​1,​2,​3,​3,​1,​1,4,5,5,5,5],R). +
- R = [[1,​1,​1],​[2],​[3,​3],​[1,​1],​[4],​[5,​5,​5,​5]] +
-</​code>​ +
-19. Implement ''​slice/​4''​ which returns the elements of a list between two positions. +
-<​code>​ +
-?- slice([1,2,​3,​4,​5,​6,​7,​8,​9,10],3,7,R). +
-R = [4,​5,​6,​7,​8] +
-</​code>​ +
-20. Implement ''​rotate/​3''​ which rotates a list by a given number of positions. +
-<​code>​ +
-?- rotate([1,​2,​3,​4,​5,​6,​7,​8],​3,​R). +
-R = [4,​5,​6,​7,​8,​1,​2,​3]+
 </​code>​ </​code>​