프로그래머는 여러 프로그래밍 언어에서 함수를 오버로딩할 수 있다. 함수 오버로딩이란 이름은 같지만 매개변수의 개수나 타입이 다른 함수들을 정의하는 것이다. 그런데 Ada 같은 언어에서는 리턴 타입까지 오버로딩할 수 있다. 즉, 이름과 매개변수가 완전히 같아도 리턴 타입이 다른 함수를 여러 개 선언할 수 있다.
다음은 함수 오버로딩의 예이다.
1: char f(float x, int y)
2: char f(float x, float y)
3: float f(float x, float y)
4: float g(float x, int y)
5: float g(int x, float y)
이러한 선언이 있을 때, 아래와 같이 변수 선언과 함수 호출을 포함한 코드를 작성할 수 있다.
1: float a = 1.0, b = 2.0;
2: int c = 3;
3: float d = g(c, f(a, b));
f의 첫 번째와 두 번째 선언은 이 호출에 사용할 수 없다. 하지만 세 번째 f는 매개변수 타입이 f(float, float)로 일치하고, 리턴 타입 float도 g(int, float)가 요구하는 것과 같으므로 사용할 수 있다. 따라서 세 번째 f와 두 번째 g를 사용하면 이 호출을 유일하게 결정할 수 있다.
각 함수 이름별로 선언에 1부터 순서대로 번호(시리얼 넘버)를 붙이면, 위 호출은 다음과 같이 나타낼 수 있다.
d = g2(c, f3(a, b))
반면 같은 선언들로는 c = g(a, f(a, c))를 만족하는 함수 조합이 존재하지 않는다.
마지막으로 다음과 같은 선언이 있다고 하자.
1: float x(float w)
2: int x(float w)
3: char y(float v)
4: char y(int v)
이 선언에서 char c = y(x(a))(단, float a)라는 호출은, x가 float을 반환하는지 int를 반환하는지에 따라 두 가지로 해석되므로 애매모호(ambiguous)하여 사용할 수 없다.
입력은 여러 개의 함수 선언과 여러 개의 함수 호출로 이루어진다.
함수 선언은 한 줄에 하나씩 주어지며 형식은 다음과 같다.
name num_params param(1) param(2) ... param(num_params) rettype
name은 함수 이름, param(i)는 i번째 매개변수의 데이터 타입, rettype은 리턴값의 데이터 타입이다(이 문제에 void 함수는 없다). num_params는 1 이상 9 이하이다. 매개변수에는 이름이 없다. 함수 이름은 알파벳 소문자 한 글자, 데이터 타입은 알파벳 대문자 한 글자이다. 같은 이름을 가진 함수 선언들은 연속해서 나타나며, 한 이름당 선언은 최대 500개이다. 두 선언이 이름·매개변수·리턴 타입까지 완전히 똑같은 경우는 없다.
문제에서 설명했듯이, 각 함수 이름별로 선언에 붙이는 번호를 시리얼 넘버라고 한다. 시리얼 넘버는 새로운 함수 이름이 처음 나올 때 1이 되고, 같은 이름의 선언이 나올 때마다 1씩 증가한다.
함수 선언이 모두 끝나면 한 줄에 #가 주어진다. 그 다음 줄부터 함수 호출이 한 줄에 하나씩 주어진다.
함수 호출의 문법은 다음과 같다.
<function_call> := <data_type> = <right_hand_side>
<right_hand_side> := <fname> <num_params> <param_list>
<param_list> := <param> | <param_list> <param>
<param> := <data_type> | <right_hand_side>
<data_type> := <upper_case_letter>
<num_params> := '1' | '2' | ... | '9'
<fname> := <lower_case_letter>
:=와 |는 문법 정의에만 쓰이는 기호로 실제 입력에는 나타나지 않는다. 각 함수 호출에 등장하는 함수 이름(호출)의 개수는 500개를 넘지 않는다. 함수 호출이 모두 끝나면 마지막 줄에 #가 하나 주어진다.
각 함수 호출에 대해 다음과 같이 출력한다.
impossible을 출력한다.ambiguous와 그 경우의 수를 함께 출력한다. 단, 경우의 수가 1000을 넘으면 수 대신 > 1000을 출력한다(즉, ambiguous > 1000).