Nhát cắt đỏ: Bỏ qua điều kiện hiện tạ

Một phần của tài liệu HỆ CHUYÊN GIA ĐỀ TÀI: CUTS AND NEGATION (Trang 37 - 40)

B. Phần dịch tiếng việt

11.4.Nhát cắt đỏ: Bỏ qua điều kiện hiện tạ

Việc lựa chọncacs luật liên tiếp của Prolog và hoạt động của nó được nhát cắt thực hiện như đặc trưng chính để tạo nên chương trình not. Người lập trình đưa ra một bản báo cáo rằng Prolog sẽ chỉ thực hiện một phần của thủ tục nếu điều kiện chắc chắn xảy ra. Nó gợi ý một điều mới và sự sai lầm về kieeur chương trình Prolog , nơi điều kiện chủ yếu trong sử dụng luật bị bỏ sót.

Ví dụ mẫu trong tài liệu là phiên bản đã được thay đổi của chương trình 11.3 về minimum. Việc so sánh trong mệnh đề thứ hai của chương trình bị loại bỏ để đưa ra chương trình.

Minimum (X,Y,X)  X ≤Y, !. Minimum (X,Y,Y).

Lập luận đưa ra để thanh minh cho chương trình sau: “ Nếu X nhỏ hơn hoặc bằng Y, thì X là nhỏ nhất. Ngược lại Y là nhỏ nhất, và sự so sánh khác giữa X và Y là không cần thiết”. Tuy nhiên, phải thực hiện so sánh, chương trình 11.3.

Đã có một sai sót lớn với lập luận này. Thay đổi chương trình có nghĩa khác nhau từ chương trình chuẩn cho minimum. Nó thành công trong điểm minimum (2,5,5). Thay đổi chương trình là một lỗi chương trình logic.

Điểm minimum sai bao hàm bởi thay đổi chương trình có thể tránh. Nó cần thiết để tạo ra sự thống nhất rõ ràng giữa đối số đầu tiên và đối số thứ 3, nó ẩn trong luật đầu tiên. Luật thay đổi là ↓ minimum (X,Y,Z)  X≤Y, !, Z=X.

Phương pháp sử dụng nhát cắt để thực hiện một mệnh đề sau một phần thống nhất đã hoàn thành khá tổng quát. Nhưng mà tổng hợp minimum là giả tạo. Nó khó hơn để viết chương trình đơn giản một cách chính xác, thêm vào nhát cắt nếu hiệu quả của nó là quan trọng, như chương trình 11.3.

Sử dụng nhát cắt với hoạt động toán tử của Prolog là cả vấn đề . Nó cho phép viết về chương trình Prolog là sai khi đọc như chương trình logic, đó là, có phần kết luận sai nhưng thực hiện chính xác bởi vì Prolog không thể thay đổi sự kết luận sai. Ví dụ, nếu điểm minimum là một trong dạng minimum (X,Y,Z) khi X và Y giải thích còn Z thì không; hoạt động thay đổi chương trình chính xác.

Hiệu quả duy nhấtcuar nhát cắt xanh có mặt trong phần 11.1 là để lược bớt các nhánh của cây tìm kiếm được hiểu là vô ích. Nhát cắt có mặt trong một chương trình thay đổi nghĩa của chương trình được gọi là nhát cắt đỏ. Việc loại đi nhát cắt đỏtuwf một chương trình thay đổi nghĩa của nó, tập hợp các điểm có thể thay đổi.

Phương pháp của một chương trình Prolog chuẩn sử sụng nhát cắt đỏ, bỏ qua điều kiện cụ thể. Biết về hoạt động của Prolog đặc biệt, thứ tự trong mỗi luật được sử dụng trong chương trình, tin tưởng vào điều kiện bỏ sót mà suy ra luật đúng. Đó là sự cần thiết trong việc thực hành chương trình Prolog , từ điều kiện cụ thể, đặc

biệt là một lần phủ định, làm cho việc chạy chương trình không hiệu quả. Nhưng cách làm bỏ qua đó dễ gây ra lỗi.

Khả năng bỏ sót trạng thái hiện có nếu lỗi của mệnh đề trước đưa đến điều kiện. Ví dụ, lỗi của sự so sánh X≤Y trong mã minimum đưa ra rằng X lớn hơn Y. Do đó việc kiểm tra X>Y có thể bỏ qua. Nhìn chung, trạng thái rõ ràng là hệ quả phủ định trước. Bằng việc sử dụng nhát cắt đỏ để bỏ qua trạng thái phủ định đang diễn đặt một cách tương đối.

Delete (XS, X,YS) 

YS là kết quả của việc xóa tất cả các sự kiện của X từ danh sách XS. Delete ([X|XS],X.YS) !, delete (XS,X,YS)

Delete ([X|XS],Z,[X|YS])  X ≠ Z, !, delete (XS,Z,YS) Delete ([ ],X,[ ]).

Chương trình 11.9a: Xóa các yếu tố từ một danh sách.

Nhìn vào sắp xếp đổi chỗ trong trương trình 11.5. Bất kỳ khi nào luật (đệ quy) đầu tiên áp dụng sẽ có một cặp yếu tố gần kề trong danh sách được sắp xếp bên ngoài. Khi luật sortthuws hai được dùng, không có một cặp thực sự và danh sách phải được sắp xếp. Do đó, trạng thái ordered (XS) có thể bỏ qua, loại luâth thứ hai như sort(XS,XS). Với minimum , đó là lời phát biểu logic chính xác.

Một chương trình ordered được loại đi từ chương trình, nhát cắt biến đổi xanh thành đỏ. Loại đi nhát cắt từ việc biến đổi không cần đến điều kiện ordered loại từ một chương trình mà có lời giải sai.

Quan tâm tới một ví dụ khác từ trạng thái bị bỏ qua. Chú ý vào quá trình xóa các yếu tố trong một danh sách ở chương trình 3.18. Hai mệnh đề đệ quy kiểm soát trường hợp riêng biệt, tương ứng với việc các yếu tố đầu danh sách có bị xóa hay không? Các trường hợp riêng biệt có thể tự nhiên được trình bày sơ qua với những nhát cắt, được chỉ dẫn chương trình 11.9a.

Có lập luận cho rằng lỗi của mệnh đề đầu tiên ngụ ý rằng phần đầu của danh sách không giống những yếu tố đã bị xóa, tính kiểm tra không đồng đều đó có thể loại đi từ mệnh đề thứ hai. Sự thay đổi chương trình được đưa ra trong chương trình 11.9a. Nhát cắt xanh trong chương trình 11.9a được so sánh với nhát cắt đỏ trong mệnh đề đầu tiên của chương trình 11.9b.

Nhìn chung, việc kiểm tra loại bỏ trong chương trình 11.9b là không thích hợp. Hiệu quả đạt được bởi việc loại bỏ là so sánh đơn giản , đánh mất đi khả năng đọc dễ và tính có thể thay đổi được của mã.

If_then_else (P,Q,R) 

Cả P và Q, hoặc không P và R If_then_else (P,Q,R)  P,! ,Q

If_then_else (P,Q,R)  R

Chương trình 11.10: Trình bày if_then_else

Chúng ta hãy nghiên cứu cách sử dụng của nhát cắt để diễm đạt cấu trúc điều khiển if_then_else . Chương trình 11.10 định nghĩa quan hệ if_then_else (Prolog,Q,R). Cụ thể tường thuật là, quan hệ là đúng nếu P và Q đúng, hoặc not P và R đúng. Chúng ta sẵn sàng chứng minh P và nếu thành công chứng minh Q, ngược lại chứng minh R.

Tính thiết thực của nhát cắt đỏ bổ sung cho lời giải này là hiển nhiên. Những cái khác sử dụng nhát cắt để làm điều kiện cụ thể sau khi R chạy. Mệnh đề thứ hai sẽ đọc.

If_then_else (P,Q,R)  not P,Q

Việc tính toán này có thể sẽ tốn kém. Điểm P sẽ phải tính toán lần thứ hai trong quyết định của not.

Chúng tôi đã phát hiện ra hơn hai loại nhát cắt đỏ. Một loại được xây dựng thành chương trình như trong định nghĩa xủa not và ≠. Loại thứ hai là nhát cắt xanh trở thành đỏ khi trạng thái trong chương trình bị loại bỏ. Tuy nhiên, có một loại thứ ba của nhát cắt đỏ . Loại này được giới thiệu vào chương trình như là một nhát cắt xanh mà đã cải tiến hiệu quả của nhát cắt đỏ và thay đổi nghĩa của chương trình.

Ví dụ, thử viết một kiểu hiệu quả của member mà đã nhiều lần không thành công khi có các yếu tố của một bản sap chép trong danh sách. Hiển thị thủ tục đó, một lần sử dụng nhát cắt để tránh quay lui một yếu tố được tìm là thành viên của danh sách. (adsbygoogle = window.adsbygoogle || []).push({});

Mã tương ứng là:

Member (X, [X|XS])  !

Member (X, [Y|YS])  member (X,YS)

Thật vậy, thêm một nhát cắt thay đổi hoạt động của chương trình. Tuy nhiên, bât giờ nó không còn hiệu quả khác ngoài member, ví dụ, truy vấn member (X, [1,2,3])?đưa ra duy nhất một giải pháp X=1. Đó là member_check, giới thiệu ở chương trình 7.3, với trạng thái cụ thể X khác Y đã bỏ qua, và do đó nhát cắt là đỏ.

Bài tập cho phần 11.4

(i) Thảo luận về vị trí nhát cắt đặt trong chương trình 9.3. Chú ý xem tổ hợp nhát cắt- phần đuôi có ích không và điều kiện rõ ràng có bị loại không? (ii) Phân tích mối quan hệ trong chương trình 3.19 cho select và việc thêm

một nhát cắt chứa đựng trong chương trình. Select ([X, [X|XS],XS)  !.

Select (X, [Y|YS], [Y|ZS])  select (X,YS,ZS) (Gợi ý: Quan tâm đến biến số select )

Một phần của tài liệu HỆ CHUYÊN GIA ĐỀ TÀI: CUTS AND NEGATION (Trang 37 - 40)