помогите пожалуйста написать программу

{ проверка, простое ли число (взято из FAQ)... }
function isPrime(X: word): boolean;
var
i: integer;
Begin
isPrime:=false;
for i:=2 to trunc(sqrt(x)) do
if x mod i = 0 then Exit;
isPrime:=true
End;
var
my_list: tlist; { это двухсвязный список }
i: integer;
p: ptitem;
is_ok: boolean;
T: integer;
digit_set: set of byte;
before_list: Pointer;
begin
my_list.init;
mark(before_list); { потом к этому состоянию вернемся через release }
for i := 1 to 10 do
my_list.append(arr[i]); { заполняем список }
my_list.print; { и печатаем, для проверки }
{ проверяем на упорядоченность }
p := my_list.first;
is_ok := true;
while assigned(p) do begin
if p^.next <> nil then
{ это проверка на невозрастание последней цифры,
если надо - сюда же можешь добавить и первую,
но так как числа могут быть и 1, и 2, и 3-значными,
может возникнуть проблема }
is_ok := is_ok and ((p^.info mod 10) >= (p^.next^.info mod 10));
p := p^.next;
end;
if is_ok then begin { последовательность упорядочена, делаем что надо: }
{ опять проходим по списку с начала }
p := my_list.first;
while assigned(p) do begin
if not isPrime(p^.info) then
{ число - составное, удаляем элемент }
my_list.remove_item(p)
else begin { число простое }
{ здесь - проверяем на наличие цифр 1, 5, 7 в числе
я бы делал так: }
T := p^.info;
while T > 0 do begin
digit_set := digit_set + [(T mod 10)]; T := T div 10;
end;
{ если присутствует одна из цифр 1, 5, 7 то
продублировать данное значение }
if (1 in digit_set) or (5 in digit_set) or (7 in digit_set) then
my_list.insert_after(p, p^.info);
end;
p := p^.next;
end;
end
else begin
{ список неупорядочен - просто отсортируй его любым способом }
end;
my_list.print; { опять для проверки }
{ возвращаемся к ранее запомненному состоянию
кучи - список будет удален }
release(before_list);
end.