Thật không may, có quá nhiều thứ đang diễn ra ở đây. Vì vậy, thật dễ dàng để trộn lẫn mọi thứ. Việc sử dụng "đầy đủ" trong "đầy đủ" và "trừu tượng hóa đầy đủ" đề cập đến những ý tưởng hoàn toàn khác nhau về sự đầy đủ. Nhưng, cũng có một số kết nối mơ hồ giữa họ. Vì vậy, đây sẽ là một câu trả lời phức tạp.
Tính đầy đủ : "Âm thanh và hoàn chỉnh" là một thuộc tính mà bạn muốn cho một logic truyền thống có liên quan đến ngữ nghĩa của nó. Soundness có nghĩa là bất cứ điều gì bạn có thể chứng minh trong logic là đúng trong mô hình ngữ nghĩa. Tính đầy đủ có nghĩa là bất cứ điều gì là đúng trong mô hình ngữ nghĩa đều có thể chứng minh được trong logic. Chúng tôi nói rằng một logic là âm thanh và hoàn chỉnh cho một mô hình ngữ nghĩa cụ thể. Khi chúng ta đến với logic xây dựng, chẳng hạn như lý thuyết loại Martin-Lof hoặc logic tuyến tính, chúng tôi không chỉ quan tâm đến việc liệu các công thức có thể chứng minh được không, mà còn cả bằng chứng của chúng là gì. Một công thức có thể chứng minh có thể có nhiều bằng chứng và logic xây dựng muốn tách chúng ra. Vì vậy, một ngữ nghĩa cho logic xây dựng bao gồm việc xác định không chỉ liệu một công thức có đúng hay không, mà còn một số khái niệm ngữ nghĩa trừu tượng về "bằng chứng" ("bằng chứng") cho sự thật của nó. Abramsky và các đồng nghiệp đã đặt ra thuật ngữ "tính đầy đủ" có nghĩa là các bằng chứng trong logic có thể diễn tả tất cả các bằng chứng ngữ nghĩa trong mô hình. Vì vậy, "đầy đủ" đề cập đến bằng chứng ở đây. Một logic "hoàn chỉnh" có thể chứng minh mọi thứ nó cần. Một logic "hoàn chỉnh đầy đủ" có tất cả các bằng chứng mà nó cần phải có. Vì vậy, "tính đầy đủ" có nghĩa là "tính đầy đủ mang tính xây dựng" hoặc "tính đầy đủ bằng chứng". Điều này không có gì để làm với sự trừu tượng đầy đủ.
: "Đầy đủ và trừu tượng hoàn toàn" là một thuộc tính bạn muốn cho mô hình ngữ nghĩa của ngôn ngữ lập trình. (Lưu ý sự khác biệt đầu tiên: chúng tôi hiện đang xử lý các thuộc tính của mô hình ngữ nghĩaPhương pháp chứng minh trừu tượng đầy đủ . (Nhưng, một điều như vậy về mặt lý thuyết là có thể, và một trong những ngày này ai đó có thể làm như vậy.), không phải là thuộc tính của ngôn ngữ!) Tính đầy đủ có nghĩa là, bất cứ khi nào hai thuật ngữ có cùng ý nghĩa trong mô hình ngữ nghĩa, chúng tương đương quan sát trong ngôn ngữ lập trình (đối với một số khái niệm thực thi). Trừu tượng hóa đầy đủ có nghĩa là, nếu hai thuật ngữ tương đương quan sát, chúng có cùng ý nghĩa trong mô hình ngữ nghĩa. Những ý tưởng này có thể liên quan đến sự đúng đắn và đầy đủ, nhưng theo một cách hơi khó hiểu. Nếu chúng ta nghĩ về mô hình ngữ nghĩa của ngôn ngữ lập trình là "logic" hoặc "phương pháp chứng minh" để nói về sự tương đương quan sát, thì tính thỏa đáng có nghĩa là phương pháp chứng minh này là âm thanh; trừu tượng hóa đầy đủ có nghĩa là phương pháp chứng minh này đã hoàn thành. Không có khái niệm "đầy đủ"
Trong trường hợp của bạn, bạn quan tâm đến các bản dịch hơn là các mô hình ngữ nghĩa. Các tính chất của sự đầy đủ và trừu tượng hóa đầy đủ có thể được mở rộng để đối phó với các bản dịch như sau. Bạn nghĩ về ngôn ngữ đích là "mô hình ngữ nghĩa" của bạn, nghĩa là một chủ nghĩa hình thức mà bạn hoàn toàn hiểu được bằng cách nào đó. Nếu vậy, bạn có một số khái niệm về sự tương đương cho nó. Sau đó, chúng tôi nói rằng bản dịch là đầy đủ nếu, bất cứ khi nào bản dịch của hai chương trình nguồn tương đương với ngôn ngữ đích, chúng đều tương đương quan sát trong ngôn ngữ nguồn. Chúng tôi nói rằng nó hoàn toàn trừu tượng nếu, bất cứ khi nào hai chương trình nguồn tương đương quan sát trong ngôn ngữ nguồn, bản dịch của chúng tương đương với ngôn ngữ đích.
Trong thực tế, tôi không biết bất kỳ ngôn ngữ mục tiêu nào mà chúng tôi thực sự hoàn toàn "hiểu". Tất cả những gì chúng ta biết là một số khái niệm khác về sự tương đương quan sát cho ngôn ngữ đích. Trong trường hợp đó, bản dịch là đầy đủ nếu sự tương đương quan sát của các bản dịch trong ngôn ngữ đích ngụ ý sự tương đương quan sát trong ngôn ngữ nguồn.
Bản dịch là hoàn toàn trừu tượng nếu sự tương đương quan sát của các điều khoản trong ngôn ngữ nguồn ngụ ý sự tương đương quan sát của bản dịch trong ngôn ngữ đích.
M ≅ N ⟹ τ ( M )
τ( M) ≅τ( N) ⟹ M≅N
Một số tác giả có "dịch hoàn toàn trừu tượng" có nghĩa là sự kết hợp của hai thuộc tính sau đây:
M ≅ NM≅N⟹ τ( M) ≅τ( N)
M≅N⟺τ( M) ≅τ( N)
Egger et al dường như đang mở rộng tương tự ý tưởng về sự hoàn chỉnh đầy đủ cho các bản dịch. Trong thiết lập của họ, công thức là loại và bằng chứng là các điều khoản. Bản dịch của họ dịch các loại cũng như các điều khoản. Họ gọi dịch của họ hoàn toàn trọn vẹn nếu bản dịch của một loại chỉ có những điều khoản được thu được bằng cách dịch các từ ngữ gốc của loại Một .
∀ N : τ ( A ) .MộtMột
∀ N: τ( A ) .∃ M: Một .τ( M) = N
Bây giờ cho các kết nối mơ hồ giữa đầy đủ đầy đủ và trừu tượng đầy đủ. Chứng minh rằng một mô hình ngữ nghĩa hoặc một bản dịch hoàn toàn trừu tượng thường liên quan đến một số tính xác định. Điều này là do ngôn ngữ của chúng tôi thường có thứ tự cao hơn. Vì vậy, nếu mô hình ngữ nghĩa hoặc ngôn ngữ đích có quá nhiều "bối cảnh" thì nó sẽ có thể chọc các thuật ngữ hoặc ý nghĩa ngữ nghĩa của chúng ta theo những cách không mong muốn và làm hỏng tính tương đương của chúng. "Những cách không mong muốn" có nghĩa là theo cách mà chính ngôn ngữ lập trình không thể chọc chúng. Vì vậy, để có được sự trừu tượng hóa đầy đủ, chúng ta cần đảm bảo rằng "bối cảnh" có sẵn trong mô hình ngữ nghĩa hoặc ngôn ngữ đích đến từ những ngôn ngữ nguồn ở dạng nào đó. Lưu ý rằng điều này liên quan đến tài sản đầy đủ.
Tại sao chúng ta muốn những tính chất như vậy? Nó không có gìđể làm với trình biên dịch! Chúng tôi muốn các thuộc tính này để tuyên bố rằng ngôn ngữ nguồn nhúng vào ngôn ngữ đích. Nếu chúng ta hài lòng với một ngôn ngữ đích cụ thể (như sạch sẽ, dễ hiểu, bằng cách nào đó cơ bản hoặc do Chúa ban) thì, nếu ngôn ngữ nguồn nhúng vào nó, thì chúng ta có thể khẳng định rằng ngôn ngữ nguồn không có gì mới. Nó chỉ là một mảnh của ngôn ngữ mục tiêu mà chúng ta biết và yêu thích. Nó chỉ là cú pháp đường. Vì vậy, các bản dịch trừu tượng hoàn toàn được đưa ra bởi mọi người để thiết lập rằng các ngôn ngữ đích cụ thể là tuyệt vời. Chúng đôi khi cũng được đưa ra bởi những người có ngôn ngữ lớn hoặc phức tạp để đối phó. Vì vậy, thay vì xác định trực tiếp một ngữ nghĩa cho nó, họ dịch nó sang một số ngôn ngữ cốt lõi và sau đó đưa ra ngữ nghĩa cho ngôn ngữ cốt lõi. Ví dụ, báo cáo Haskell thực hiện điều này. Nhưng sự trừu tượng hóa đầy đủ của các bản dịch này hiếm khi được chứng minh vì các ngôn ngữ nguồn rất lớn và phức tạp. Mọi người tin rằng bản dịch là tốt.
Một lần nữa, điều này không có gì để làm với trình biên dịch. Trình biên dịch hiếm khi bao giờ đầy đủ hoặc hoàn toàn trừu tượng. Và, họ không cần phải như vậy! Tất cả những gì trình biên dịch cần làm là bảo toàn hành vi thực thi của các chương trình hoàn chỉnh. Ngôn ngữ đích của trình biên dịch nói chung là rất lớn, điều đó có nghĩa là nó có rất nhiều ngữ cảnh có thể gây rối tương đương. Vì vậy, các chương trình tương đương trong ngôn ngữ nguồn hầu như không bao giờ tương đương theo ngữ cảnh khi được biên dịch.