Quine w rachunku różnym lambda


13

Chciałbym przykład quine w czystym rachunku lambda . Byłem dość zaskoczony, że nie znalazłem go przez google. Strona quine zawiera listę quinów dla wielu „prawdziwych” języków, ale nie dla rachunku lambda.

Oczywiście oznacza to zdefiniowanie, co mam na myśli przez quine w rachunku lambda, co robię poniżej. (Proszę o coś dość konkretnego).

W kilku miejscach, np. Larkin i Stocks (2004), widzę następujące cytowanie jako wyrażenie „samoreplikujące się”: . To zmniejsza się do siebie po pojedynczym etapie redukcji beta, co daje wrażenie quine. Jednak nie jest podobny do quine, ponieważ nie kończy się: dalsze redukcje beta będą wytwarzać ten sam wyraz, więc nigdy nie zmniejszy się do normalnej postaci. Dla mnie quine to program, który sam się kończy i wypisuje, dlatego chciałbym wyrażenie lambda o tej właściwości.(λx.xx)(λx.xx)

Oczywiście każde wyrażenie, które nie zawiera żadnych powtórzeń, jest już w normalnej formie i dlatego samo się zakończy i wyśle. Ale to zbyt trywialne. Proponuję więc następującą definicję w nadziei, że przyjmie ona nietrywialne rozwiązanie:

definicja (niepewna): Quine w rachunku lambda jest wyrażeniem postaci (gdzie oznacza jakieś określone wyrażenie rachunku lambda), tak że staje się , lub czymś równoważnym przy zmianach nazw zmiennych, po sprowadzeniu do postaci normalnej, dla dowolnego wejścia .

(λx.A)
A((λx.A)y)(λx.A)y

Biorąc pod uwagę, że rachunek lambda jest tak samo równoważny z Turingiem jak każdy inny język, wydaje się, że powinno to być możliwe, ale mój rachunek lambda jest zardzewiały, więc nie mogę wymyślić żadnego przykładu.

Odniesienie

James Larkin i Phil Stocks. (2004) Konferencje „Samoreplikujące się wyrażenia w rachunku Lambda Calculus” w badaniach i praktyce w zakresie technologii informacyjnych, 26 (1), 167-173. http://epublications.bond.edu.au/infotech_pubs/158


Nie jest to odpowiedź na moje pytanie, ale dla własnego odniesienia (i dla przyszłych gości) przydatne będzie łącze do wiki.haskell.org/Combinatory_logic , w którym ktoś ma o wiele głębsze przemyślenia na temat quines niż ja.
Nathaniel

Zauważ, że quine musi stworzyć swój własny kod źródłowy . Utworzenie funkcji, którą reprezentuje, nie jest wystarczające.
PyRulez

@PyRulez jaki jest kod źródłowy wyrażenia lambda? Jeśli jest to sekwencja znaków, wyrażenie lambda nie jest w stanie go wyprowadzić, w związku z czym możemy zdefiniować słowo „quine”, które oznacza coś nieco innego dla wyrażeń lambda bez obawy o dwuznaczność. Z drugiej strony, jeśli myślisz o kodzie źródłowym jako o samej ekspedycji lambda, to „kod źródłowy” i „funkcja, którą reprezentuje” są tym samym. Więc myślę, że u mnie wszystko w porządku.
Nathaniel,

istnieje kościół kodujący ciągi znaków. Rachunek lambda powinien wypisywać kodowanie kościelne ciągu znaków, które go reprezentują.
PyRulez,

Jasne, nie jest to trudne, jeśli zdefiniujesz to w ten sposób. To pytanie dotyczyło innej rzeczy.
Nathaniel,

Odpowiedzi:


8

Chcesz wyrazu takiego, że :M ΛQMΛ

QMβQ

Nie sprecyzuję żadnych dalszych ograniczeń dotyczących (np. Dotyczących jego formy i tego, czy się normalizuje) i pokażę wam, że zdecydowanie musi to być normalizacja.Q

  1. Załóżmy, że jest w normalnej formie. Wybierz (możemy to zrobić, ponieważ twierdzenie musi się trzymać dla wszystkich ). Potem są trzy przypadki.M x MQMxM

    • a Q M a x aQ to jakiś atom . Następnie . To nie sprowadza się do .aQMaxa
    • ( R S ) Q M ( R S ) x ( R S )Q to jakaś aplikacja . Następnie . jest postacią normalną na podstawie hipotezy, więc jest również w postaci normalnej i nie można go zredukować do .(RS)QM(RS)x(RS)( R S )(RS)x(RS)
    • Q to jakaś abstrakcja (jeśli ma być wolny w , to dla uproszczenia możemy po prostu wybrać równoważne dowolnej zmiennej abstrakty powyżej). Następnie . Od w postaci normalnej, to jest . W związku z tym nie możemy zredukować do .(λx.A)xAMλQM(λx.A)xβA[x/x]A(λx.A)AA(λx.A)

    Więc jeśli takie istnieje, nie może być w normalnej formie.Q

  2. Dla kompletności załóżmy, że ma normalną formę, ale nie jest w normalnej formie (być może słabo się normalizuje), tj. z takim, że : Q Nβ-nfNQMΛ

    QMβQβN

    W przypadku musi istnieć również sekwencja redukcji , ponieważ:Q x β N x β NMxQxβNxβN

    • Q β NQxβNx jest możliwe dzięki temu, że .QβN
    • N β xNx musi się znormalizować, ponieważ jest nf, a jest tylko atomem.Nβx
    • Jeśli miałaby znormalizować się do czegoś innego niż , to ma dwa nfs, co nie jest możliwe w następstwie twierdzenia Church-Rosser. (Twierdzenie Church-Rosser zasadniczo stwierdza, że ​​redukcje są zbieżne, jak zapewne już wiesz).N Q x βNxNQxβ

    Zauważ jednak, że nie jest możliwe na podstawie powyższego argumentu (1), więc nasze założenie, że ma postać normalną, nie jest możliwe do utrzymania.QNxβNQ

  3. Jeśli pozwolimy na takie , to jesteśmy pewni, że musi to być normalizacja. W takim przypadku możemy po prostu użyć kombinatora, który eliminuje wszelkie otrzymywane argumenty. Sugestia Denisa działa dobrze: Następnie tylko w dwóch redukcjach: Q

    Q(λz.(λx.λz.(xx))(λx.λz.(xx)))
    β
    QM(λz.(λx.λz.(xx))(λx.λz.(xx)))M1β(λx.λz.(xx))(λx.λz.(xx))1β(λz.((λx.λz.(xx))(λx.λz.(xx)))Q

Wynik ten nie jest bardzo zaskakujące, ponieważ w istocie pytaniem o termin, który eliminuje wszelkie argumentem to odbiera, a to jest coś, co często widzę wymienione jako bezpośrednie zastosowanie twierdzenia o stałym punkcie.


Gdybym mógł również zaakceptować odpowiedź Denisa, zrobiłbym to, ale (po tym, jak dowiedziałem się nieco więcej i byłem w stanie ją w pełni zrozumieć), ta odpowiedź naprawdę mnie przekonała, że ​​ten „kombinator quine” nie może być wdrożony przez wyrażenie lambda w normalnej formie.
Nathaniel

9

Z jednej strony jest to niemożliwe, ponieważ quine ma wypisywać własny kod, a rachunek czysto lambda nie ma możliwości wykonania danych wyjściowych.

Z drugiej strony, jeśli przyjmiesz, że wynikowy warunek jest wynikiem, to każda normalna postać jest quine.

Na przykład termin lambda jest już formą normalną, a przy założeniu, że jego wynikiem jest wynikowa forma normalna, wynikiem jest . Zatem jest quine.(λx.x)(λx.x)(λx.x)


2
To interesujący punkt. W pytaniu próbowałem podać definicję tego, co może być traktowane jako nietrywialny quine w rachunku lambda: funkcja, która zastosowana do dowolnego wejścia, redukuje się do siebie (do podstawień zmiennych). Być może jest to niemożliwe, ale nie jest to oczywiste, przynajmniej dla mnie.
Nathaniel

8

Oto propozycja:

Wybieramy jako stały punkt funkcji .Af=λt.(λz.t)

Można to zrobić za pomocą kombinatora punktów stałych i ustawienie .Y=λg.((λx.g (x x)) (λx.g (x x)))A=Yf=(λx.λz.(x x)) (λx.λz.(x x))

Teraz pokazujemy, że jest quine. Rzeczywiście zmniejsza się do , więc oznacza to, że dla dowolnego , .AAλz.Ay(λz.A)yβAβ(λz.A)


Jest to dość schludne i odpowiada na zadane pytanie, więc czuję się źle, że go nie zaakceptowałem --- ale niestety popełniłem niewielki błąd, określając, czego chcę. Naprawdę chcę stać się gdy zostanie zredukowany do normalnej postaci, nie tylko po etapie redukcji wersji beta. (Zobacz zaktualizowane pytanie, dlaczego). Oznacza to, że nie może zawierać żadnych powtórzeń, ponieważ jeśli tak, redukcja nie zostanie zakończona. (λz.A)y(λz.A)A
Nathaniel

1
Ach, w tym przypadku jestem całkiem pewien, że to jest niemożliwe, z powodu następującego intuicji (nie dowód, ale prawie): Chcesz odgrywać żadnej roli, ponieważ ma do pracy dla każdego , tak nie powinny być wolne w . Następnie tylko redukuje się do . Teraz chcesz zredukować do . To ostatnie wyrażenie nie może być normalną formą, ponieważ wnętrze można ponownie zmniejszyć ...yyyA(λz.A)yAAλz.AA
Denis

1
To zachowanie nie jest bardzo zaskakujące, ponieważ ponieważ „drukowanie” jest ponownie instrukcją, napis wypisujący własny kod jest zawsze wykonywalny. To, o co pytasz, jest podobne do pytania o quine, tak że jeśli wykonasz wyjście, nic nie drukuje (co z definicji jest niemożliwe). λcalculus
Denis,

Ach, masz rację oczywiście. Powinienem to zobaczyć. Nie jestem pewien, czy przyjąć odpowiedź, czy edytować pytanie, aby poprosić o lepszą definicję. Zastanowię się trochę. (Nadal wydaje mi się, że powinno być możliwe podanie nietrywialnej definicji, w której prosisz o coś, co się skończy, ale nie jestem pewien jak).
Nathaniel

Chociaż to powiedziawszy, czy to prawda, że (zakładam, że masz na myśli ) nie musi być wolny w ? Np. może być czymś podobnym do . (Pseudokod, ponieważ nie jestem pewien, czy możliwe jest zdefiniowanie operatora równości dla dowolnych wyrażeń w rachunku lambda, ale myślę, że rozumiecie, co mam na myśli).zzAAif z==p then return q, otherwise return q
Nathaniel
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.