Content text TYPE P2 2023 SOLUTION.pdf
Giải: Ta nhận thấy x, z là hàm còn y là biến. Đáp án của chúng ta có dạng (T1->T2)*T3*(T4->T5) -> T6. Với T3 là kiểu của biến y. T1, T4 là kiểu nhận vào của hàm x, z. T2, T5, T6 là kiểu trả về của hàm x, z và foo. Các nhánh thực thi của chương trình phải có cùng kiểu -> z có kiểu trả về là integer (cùng kiểu với 1) và hàm foo có kiểu trả về là integer. Vậy T5 = T6 = integer. Kiểu của hàm z là T3 -> integer. Biểu thức điều kiện phải có kiểu boolean -> Hàm x có kiểu trả về là boolean. Vậy T2 = boolean. Kiểu của hàm x là T3 -> boolean Biểu thức kiểu của hàm foo là (T3->boolean)*T3*(T3 -> integer)->integer hay (T1->boolean)*T1*(T1 -> integer)->integer theo đúng thứ tự đề bài đặt ra.
Giải: Với dạng bài này, ta xác định kiểu của từng thành phần rồi hợp lại sẽ dễ hơn. Ta có: - x:char - z:integer - t:array(1..10,pointer(real) - y: record((z*integer)*(t*array(1..10,pointer(real)))) Đáp án: record((x*char)*(y*record((z*integer)*(t*array(1..10,pointer(real)))))) Giải: Chọn B, C Một đối tượng của lớp B có thể có kiểu là chính nó hoặc cha của nó. Giải: Ta làm giống câu 2 Ta có: - x:integer
- z:char - t:array(1..10,pointer(real) - y: record((z*char)*(t*array(1..10,pointer(real)))) Đáp án: record((x*integer)*(y*record((z*char)*(t*array(1..10,pointer(real)))))) Giải: integer*real->char Giải: Dựa vào đề bài, ta nhận thấy x, z là hàm ; y là biến. Đáp án của bài toán có dạng: (T1 -> T2)*T3*(T4->T5)->T6. Trong đó T3 là kiểu của biến y; T1, T4 là kiểu nhận vào của hàm x và z. T2, T5, T6 lần lượt là kiểu trả về của hàm x, z và foo. Xét hàm x(z(y)). Ta có z(y) có kiểu là T3 -> T5. Vậy ta có T1 = T5 (T1 là kiểu nhận vào của hàm x). Hàm x có kiểu là T5 -> T2 Kiểu trả về của hàm foo giống với kiểu trả về của hàm x và bằng T2 Biểu thức kiểu của hàm foo là (T5->T2)*T3*(T3->T5)->T2 Sắp xếp theo đúng thứ tự (T bắt đầu tính từ 1), ta có đáp án là: (T1->T2)*T3*(T3->T1)->T2, với T1 là kiểu của biến y; T2, T3 là kiểu trả về của biến z và x.
Cách làm tương tự câu 6. Dựa vào các dự kiện của đề bài, ta nhận thấy y , z là hàm ; x là biến. Đáp án của bài toán có dạng: ((T1*(T2->T3)*(T4->T5)) -> T6. Trong đó T1 là kiểu của biến x; T2, T4 là kiểu nhận vào của hàm y và z. T3, T5, T6 lần lượt là kiểu trả về của hàm y, z và foo. Ta nhận thấy kiểu trả về của hàm foo giống với kiểu trả về của hàm y -> T6 = T3 Xét hàm z(x), ta nhận thấy hàm này có kiểu là T1 -> T5. Xét hàm y(z(x)), ta nhận thấy hàm này có kiểu là T5 -> T3. Vậy biểu thức kiểu của hàm foo là T1*(T5->T3)*(T1->T5) -> T3 Viết lại theo đúng thứ tự , ta có T1*(T2->T3)*(T1->T2)->T3 ; với T1 là kiểu của biến x, T2, T3 là kiểu trả về của biến z và y. Giải: Ta nhận thấy x là biến ; y, z là hàm. Biểu thức + chỉ áp dụng trên kiểu nguyên nên ta suy ra được 3 điều (1) x có kiểu là integer do tham gia vào biểu thức x + 1. (2) Kiểu trả về của hàm z là integer. (3) Hàm foo có kiểu trả về là integer Từ (1) và (2), ta có kiểu của hàm z(x) là integer -> integer. Biểu thức điều kiện của if phải có kiểu boolean -> kiểu trả về của hàm y là boolean. Ta có kiểu của hàm y là integer -> boolean. Từ những lập luận trên, ta có biểu thức kiểu của hàm foo là integer*(integer->boolean)*(integer->integer)->integer.