Czy można obliczyć, czy dwie funkcje są równe ekstensywne?


9

Jeśli masz dwie funkcje implementujące inny algorytm sortowania, to czy można na podstawie kodu źródłowego wnioskować, że obie mają takie same właściwości zewnętrzne? Czy to znaczy, że oboje będą mieć możliwą nieposortowaną sekwencję jako dane wejściowe i posortowaną sekwencję jako dane wyjściowe? W jaki sposób te właściwości zewnętrzne mogą być określone przez kod źródłowy? A jak opisałbyś te właściwości zewnętrzne? Jaka notacja zostanie zastosowana?

Zewnętrzne właściwości można podać, definiując je jawnie, na przykład w systemie typów, ale zastanawiam się, czy można to zrobić niejawnie. Czy też teoretycznie niemożliwe jest wnioskowanie o tego rodzaju semantyce? Interesuje mnie, czy jest to możliwe w przypadku dowolnych funkcji, a nie tylko algorytmów sortowania, zakładając, że takie funkcje jak zawsze będą się zatrzymywać i nie będą miały żadnych skutków ubocznych.

Czy powinienem patrzeć na semantykę denotacyjną, czy też nie jest ze sobą powiązany?

Interesują mnie wskaźniki do badań w tej dziedzinie oraz różne terminy używane do opisania tematu, które mogą pomóc w wyszukiwaniu literatury.

Odpowiedzi:


8

Tak. Jeśli możesz sprawdzić, czy są one takie same, komputer może to zrobić.

Oto krótka specyfikacja sortowania liczb całkowitych w Coq:

Inductive natlist : Type :=
| nil : natlist
| cons : nat → natlist → natlist.

Fixpoint is_sorted (l : natlist ) : bool :=
    match l with
    |  nil => true
    |  (cons x nil) => true
    |  (cons x (cons y r)) => if x <= y then is_sorted (cons y r) else false
    end.

...

Theorem sort_spec : forall l, is_sorted (sort_list l).

Specyfikacja może być bezpośrednio zakodowana w deklaracji sortowania przy użyciu typów zależnych.

W przypadku tego konkretnego problemu John Darlington wykazał w latach 70., że 6 rodzin algorytmów sortowania można uzyskać poprzez mechaniczne przekształcenie specyfikacji rodzaju w implementację; Uważam, że pod nazwą „pochodna programu oparta na semantyce”.

W świecie inżynierii oprogramowania znalezienie dodatkowych równoważnych funkcji jest znane jako „wykrywanie klonów semantycznych”.

Dave Clarke udzielił również dobrej odpowiedzi na to pytanie w CS StackExchange: /cs/2059/how-do-you-check-if-two-algorithms-return-the-same-result -dla dowolnego wejścia

Wszystko to należy do metod formalnych i języków programowania . Semantyka denotacyjna to jedna z klas technik modelowania semantyki, ale popadła w niełaskę, ponieważ jest trudna w użyciu w porównaniu do semantyki operacyjnej.


Dziękuję za odpowiedź! Właśnie tego szukałem.
Matthijs Steen,

4
Zdecydowanie nie zgadzam się ze stwierdzeniem, że semantyka denotacyjna „wypadła z łaski”. To zależy w dużej mierze od tego, kogo zapytasz.
Andrej Bauer,

5

Ekstensywna równość w kompletnych językach programowania Turinga jest w ogólności nierozstrzygalna, ale nie powinno to powstrzymywać cię przed możliwością weryfikacji lub sfałszowania, czy dowolne dwie konkretne funkcje są w równym stopniu rozszerzone.

Weryfikacja może przebiegać w wielu formach, na przykład można uzasadnić teorię zbiorów ZFC za pomocą semantyki operacyjnej. Byłoby to jednak bolesne. Jeśli istnieje semantyka denotacyjna, można jej również użyć, ale dobra semantyka denotacyjna istnieje tylko dla kilku języków. Zwykle używa się logiki programu, np. Logiki Hoare'a , do pokazania ekstensywnej równości programów. Aby to zrobić, logika Hoare'a dla języków z funkcjami zazwyczaj wymaga aksjomatu, który to określaf=gxα.f(x)=g(x), przy założeniu, że f i g są funkcjami typu αβ (szczegóły wariantu aksjomat ze szczegółami wybranego podejścia do logiki Hoare'a).


Dziękuję za odpowiedź. Zajmę się logiką Hoare'a. Czy semantyka denotacyjna jest trudna do zdefiniowania w porównaniu z logiką Hoare'a, czy też jest po prostu mniej odpowiednia dla większości języków? Czy równouprawnienie ekstensywne jest ogólnie nierozstrzygalne z powodu problemu zatrzymania? Zatem jeśli funkcje miałyby się zawsze zatrzymywać, tak jak w językach funkcjonalnych, to czy nie byłoby w ogóle rozstrzygalne? Czy są też inne powody, dla których ogólnie nie można podjąć decyzji?
Matthijs Steen,

@ Matthijs Steen: Trudno jest znaleźć dobrą semantykę denotacyjną dla języków programowania z interesującymi funkcjami. Natomiast logika Hoare'a rozkwitła w ostatnim dziesięcioleciu i możemy ją teraz zbudować dla niemal dowolnego języka programowania. Ekstensywna równość jest nierozstrzygalna, ponieważ (nieco upraszczając) w przeciwnym razie można sprawdzić, czy dowolny programP jest kontekstowo równoważny z 0, zawsze kończący się program, który jest wariantem problemu zatrzymania. Jeśli narzucisz wystarczająco dużo warunków skończoności na język, w końcu skończysz z czymś, co ... (cd.)
Martin Berger,

... ma decydującą równość kontekstową. Należy jednak zauważyć, że R. Loader wykazał, że nawet skończony PCF ma nierozstrzygalną równoważność kontekstową.
Martin Berger,

-2

Szybka odpowiedź (przyznaję, że nie spędziłem dużo czasu ...) Twierdzenie Rice'a mówi, że w przypadku każdego nietrywialnego pytania nierozstrzygalne jest stwierdzenie, czy funkcja obliczona przez program będzie miała właściwość, czy nie. Dlatego pytanie tutaj jest nierozstrzygalne


1
Czy nie stwierdza się, że „... dla jakiejkolwiek nietrywialnej własności funkcji cząstkowych ...”, więc czy nie byłoby rozstrzygalne dla funkcji całkowitych?
Matthijs Steen,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.