Nhiều ngôn ngữ lập trình dùng tương thích kiểu theo cấu trúc (structural type equivalence) cho kiểu bản ghi (record/struct): hai kiểu bản ghi được coi là tương thích nếu "hình dạng" (cấu trúc) các trường của chúng giống nhau, bất kể tên kiểu hay tên trường có trùng nhau hay không.
Cho trước m định nghĩa kiểu bản ghi, được định nghĩa tuần tự (một kiểu chỉ có thể tham chiếu tới các kiểu đã định nghĩa trước đó hoặc bốn kiểu cơ bản int, float, bool, string). Mỗi định nghĩa gồm: tên kiểu, số trường f, và f cặp tên_trường:kiểu_trường.
Định nghĩa đệ quy chữ ký cấu trúc (structural signature) của một kiểu T:
Hai kiểu bản ghi A, B tương thích cấu trúc khi và chỉ khi sig(A)=sig(B) (bằng nhau chính xác, không áp dụng widening int→float ở đây).
Ví dụ: Point{x:int, y:int} và Point2{a:int, b:int} có cùng chữ ký (int, int) nên tương thích, dù tên kiểu và tên trường khác nhau.
Dòng đầu là số nguyên m (1≤m≤200) — số định nghĩa kiểu bản ghi.
m dòng tiếp theo, mỗi dòng định nghĩa một kiểu theo thứ tự token: TênKiểu, số nguyên f (số trường), rồi f token dạng tên_trường:kiểu_trường (kiểu_trường là một trong 4 kiểu cơ bản hoặc tên một kiểu bản ghi đã định nghĩa ở dòng trước).
Dòng cuối cùng gồm hai tên kiểu A và B (đã được định nghĩa ở trên) cần so sánh.
In ra Compatible nếu hai kiểu A, B tương thích cấu trúc, ngược lại in ra Incompatible.
Ví dụ:
Đầu vào:
2
Point 2 x:int y:int
Point2 2 a:int b:int
Point Point2
Đầu ra:
Compatible
Đầu vào:
2
Point 2 x:int y:int
Point2 2 a:int b:float
Point Point2
Đầu ra:
Incompatible
Đang tải editor...