Nhát cắt xanh: Diễn đạt thuyết tiền định

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

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

1.2.Nhát cắt xanh: Diễn đạt thuyết tiền định

Chú ý tới phép trộn chương trình (Xs, Ys, Zs) (chương 11.1), kết nối hai danh sách đã sắp xếp Xs và Ys thành danh sách sắp xếp Zs.

Kết hợp những con số của hai danh sách đã sắp xếp là quá trình hoạt động của thuyết tiền định. Chỉ một trong số 5 mệnh đề kết hợp áp dụng cho mỗi mục đích cụ thể trong tính toán đưa ra. Cụ thể hơn là : khi so sánh hai số X và Y, ví dụ, duy nhất một trong ba phép so sánh X< Y, X=:=, và X > Y có thể đúng . Một lần kiểm tra thành công thì không còn khả năng những phép kiểm tra khác sẽ thành công nữa.

Merge(Xs, Ys, Zs) ←

Zs là một danh sách các số nguyên đã sắp xếp thu được từ việc kết hợp danh sách Xs và Ys

Merge ([ X│Xs], [Y│Ys],[ X│Zs]) ← X< Y, merge (Xs, [Y│Ys], Zs) Merge ([ X│Xs], [Y│Ys],[ X, Y│Zs]) ← X=:= Y, merge (Xs,Ys, Zs) Merge ([ X│Xs], [Y│Ys],[Y│Zs]) ← X >Y, merge (Xs ,Ys, Zs). Merge (Xs,, [ ], Xs).

Merge ([ ], Ys, Ys).

Chương trình 11.1: Trộn danh sách theo thứ tự

Nhát cắt, biểu thị dấu !, sử dụng để diễn đạt tính chất tác động qua lại duy nhất của mỗi lần kiểm tra. Nó được đặt sau phép kiểm tra số học. ví dụ mệnh đề merge đầu tiên được viết như sau:

Merge ([ X│Xs], [Y│Ys],[ X│Zs]) ←X< Y,!merge (Xs, [Y│Ys], Zs) Một thuộc tính nữa, nhát cắt được quan tâm khi nó theo sau.

Mục tiêu thành công và cam kết của Prolog là cho tất cả sự lựa chọn được tạo ra từ mục đích gốc thống nhất với mệnh đề đầu mà nhát cắt tìm thấy.

Mặc dù định nghĩa này đã hoàn thành và chính xác, nhánh và hàm ý của nó luôn luôn thông rõ ràng.

Việc hiểu lầm đó liên quan tới tác dụng của nhát cắt là cơ sở chín cho những lỗi của các nhà lập trình Prolog có kinh nghiệm hoặc không có kinh nghiệm. Sự hiểu lầm đó chủ yếu ở hai loại: Khó khăn để nhát cắt lược bớt hướng tính tóan ;và khó khăn để nó không lược bớt những giải pháp nơi thực tế đã làm:

Những ý sau đay giúp cho định nghĩa đã đề cập ở trên trở nên ngắn gọn, xuc tích:

• Thứ nhất, nhát cắt lược bớt tất cả các mệnh đề heo sau nó. mục tiêu p thống nhất với mệnh đề chứa đưụng nhát cắt mà không thể đưa ra lời giải thành công để sử dụng mệnh đề mới sau mệnh đề đó

• Thứ hai, nhát cắt lược bớt tát cả các lời giải khác cho mục đích két hợp xuất hiện ở phía trái mệnh đề. Ví dụ, mục đích kết hợp sau bởi nhát cắt sẽ đưa ra nhiều nhát một lời giải

• Mặt khác, nhát cắt không ảnh hưởng tới điểm ở bên phải trong mệnh đề. Chúng có tể đưa ra nhiều hơn một giải pháp trong sự kiện quay lui. Tuy nhiên, một lần kết hợp lỗi, nghiên cứu bắt nguồn từ những trật tự cuối cùng khác để lựa chọn một mệnh đề bao hàm nhát cắt.

Hình 11.1:Hệ quả của nhát cắt

Chúng ta hãy quan tâm tới đoạn trong cây tìm kiếm của chuôi truy vấn merge([1,3,5], [2,3], XS)? và chú ý tới chương trình 11.2, một phiên bản của merge với những nhát cắt đã được thêm vào. Đoạn đưa ra là hình 11.1. Thay đổi truy vấn đầu tiên cho truy vấn kết hợp là 1<2,!, merge([3,5], [2,3], XS1) mục đích 1<2 đ ã đ ư ợc gi ải quy ết thành công, với tới nút đánh d ấu (*) trong c ây t ìm ki ếm. Kết quả của việc thực hiện nhát cắt là lược bớt cac snhánh đánh dấu a và b.

Tiếp tục thảo luận về chương trình 11.2, việc sắp xếp nhát cắt trong ba mệnh đề đệ quy sau việc kiểm tra merge(1). Hai trường hợp cơ bản của merge là phép tiền định. Bằng việc kết hợp đã chọn được mệnh đề chính xác và do đó một nhát cắt được đặt như mục tiêu đầu tiên (và trong thực tế chỉ có một mục tiêu) trong phần chính của luật. Chú ý rằng những nhát cắt loại ralowif giải thừa về điểm merge ([ ],

Nhóm SVTH: Chu Thị Thanh Hiền – Phạm Thị Huệ 27

!,merge([3,5], [2,3],Xs1) merge([3,5], [2,3],Xs1) 1<2,!,merge([3,5], [2,3],X s1) 1>2,!,merge([1,3,5], [3],Xs1) Merge([1,3,5], [2,3]),Xs) 1=:=2,!,merge([3,5], [3],Xs1) {Xs=[1|Xs1 ] } {X s=[1,2|X s1 ] } {Xs=[2|Xs1 ] } { } { } (b) (a) (*)

[ ], XS). Trước đây, nó đã hoàn thành một cách vụng về, bằng việc chỉ rõ ràng XS (hoặc YS) có ít nhất một yếu tố.

1. Nhát cắt sau mệnh đề merge thứ ba là không cần thiết trong quá trình thực hiện. Nguyên tắc là, nó không gây ra giảm bớt của việc tìm kiếm. Nhưng nó lại làm cho chương trình cân đối hơn và giống như một câu đùa cổ nói về “súp gà,nó không đau”.

merge (XS, YS, ZS) 

ZS là một danh sách các số nguyên đã sắp xếp thu được từ việc kết hợp danh sách XS và YS.

Merge ([X|XS],[Y|YS],[X|ZS])  X<Y, !, merge (XS,[ Y|YS],ZS). Merge ([X|XS],[Y|YS],[X,Y|ZS])  X=:=Y, !, merge (XS,YS,ZS). Merge ([X|XS],[Y|YS],[Y|ZS])  X>Y, !, merge (X|XS,YS,ZS). Merge (XS,[ ], XS)  !

Merge ([ ], YS,YS)  !

Chương trình 11.2: Trộn nhát cắt

Chúng ta phát biểu lại tác dụng của nhát cắt trong mệnh đề chung C= A  B1,…, BK,!,BK+2,…Bn trong định nghĩa thủ tục. Nếu điểm G hiện tại kết hợp với phần đầu của C, và B1,…Bk sẽ thành công hơn, sau đó nhát cắt có tác dụng. Chương trình được cho phép để chọn C biến đổi G; bất ký một mệnh đề nào khác A kết hợp với G đều bị lòe đi. Thêm nữa, Bi phải lỗi với điều kiện i> k+1, quay lui tới điểm !.Lựa chọn còn lại khác trong quá trình tính toán Bj, i ≤k, bị lược bớt từ cây tìm kiếm. Khi thực tế quay lui tới nhát cắt, thì nhát cắt lỗi và việc tìm kiếm xuất phát từ lựa cjhonj cuối cùng trước việc chọn G để biến đổi C.

Nhát cắt sử dụng trong chương trình merge diễn đát rằng merge là thuyết tiền định. Đó là, chỉ một trong số mệnh đề được sử dụng thành công cho việc chứng minh một điểm thích hợp. Nhát cắt thực hiện tính toán một mệnh đề đơn giản, chỉ một lần tiến hành tính toán đủ để xác định rằng đó là mệnh đề duy nhất được sử dụng.

Có thông báo là nhát cắt lược bớt cây tìm kiếm và do đó Prolog rút ngắn hướng đi tắt, nó làm thay đổi thời gian tính toán. Trong thực tế, thậm chí sử dụng một nhát cắt trong chương trình quan trọng hơn cho việc tiết kiệm bộ nhớ. Bằng trực giác, tính toán là định trước một ít thông tin cần được giữ để dùng trong suej kiện quay lui. Nó được khai thác bởi sự bổ sung của Prolog với phần đuôi của đệ quy tối ưu, thảo luận ở mục 11.2. (adsbygoogle = window.adsbygoogle || []).push({});

Chúng ta hãy quan tâm tới ví dụ khác. Nhát cắt được thêm vào trong chương trình để tính toán hai số nhỏ nhất (chương trình 3.7) một cách chính xác giống như

merge. Một lần kiểm tra thuật toán thành công, sẽ không còn khả năng để thuật toán khác thành công. Chương trình 11.3 là kiểu minimum được thay đổi để phù hợp. Minimum (X,Y,Min) 

Min là số nhỏ nhất so với X và Y Minimum (X,Y,X)  X≤Y,! .

Minimum (X,Y,y) X>Y,! .

Chương trình 11.3: Minimum với nhát cắt

Polynomial (Term,X) 

Term là một đa thức trong X. Polynomial (X,X)  ! .

Polynomial (Term, X)  constant(Term), ! .

Polynomial (Term1 +Term2,X)  !, polynomial (Term1,X), polynomial (Term2,X) Polynomial (Term1 - Term2,X)  !, polynomial (Term1,X), polynomial (Term2,X) Polynomial (Term1 *Term2,X)  !, polynomial (Term1,X), polynomial (Term2,X) Polynomial (Term1 \Term2,X)  !, polynomial (Term1,X), polynomial (Term2,X) Polynomial (Term ↑ N,X)  !, integer(N), N≥0, polynomial (Term, X).

Chương trình 11.4: Thừa nhận đa thức

Một ví dụ quan trọng hơn là nhát cắt thêm vào để chỉ ra rằng chương trình là tiền định cung cấp bởi chương trình 3.29. Chương trình này định nghĩa mối quan hệ polynomial (Term, X) cho việc thừa nhận nếu Term là một đa thức trong X. Luật tiêu biểu là:

Polynomial (Term1+Term2 ,X)

Polynomial (Term1,X), polynomial (Term2,X).

Một số hạng đã kiểm tra được thừa nhận giống như một phép tính tổng (bằng việc kết hợp với phần đầu của luật), nó được hiểu rằng không có luật đa thức nào khác sẽ thích hợp. Chương trình 11.4 đưa ra một chương trình đã hoàn thành với những nhát cắt được thêm vào. Kết quả là mộ chương trình tiền định có sự pha trộn giữa những nhát cắt sau điều kiện và sự pha trộn giữa những nhát cắt sau việc kết hợp.

Khi thảo luận chương trình Prolog về số học, khả năng sử dụng số học cơ bản hơn là chương trình đệ quy logic, chúng ta tranh luận rằng tăng hiệu quả thường xuyên đạt được sự linh hoạt. Chương trình logic mất đi bội số sử dụng khi diễn đạt như những chương trình Prolog. Nhát cắt trong chương trình Prolog ít linh hoạt hơn nhát cắt tự do tương đương. Đó không phải là vấn đề nếu ý định sử dụng chương trình là một cách để bắt đầu.

Những ví dụ khác đã chứng minh sự lược bớt tính có ích khác cho điểm gốc. Chúng tôi đưa ra một ví dụ mà tại đó nhát cắt có hiệu quả giúp đỡ lớn để loại bỏ tính toán thừa về một trong hai điểm. Quan tâm tới mệnh đề đệ quy về việc trao đổi một đoạn chương trình sau:

Sort (XS,YS) 

Append (AS, [X,Y|BS],XS), X>Y

Append (AS, [Y,X|BS],XS1), Sort (XS1,YS)

Chương trình tìm kiếm một cặp yếu tố gần kề mà chúng đặt ngoài thứ tự trao đổi chúng, và tiếp tục cho đến khi danh sách được sắp xếp. Mệnh đề cơ bản là:

Sort (XS, XS)  ordered(XS).

Chú ý tới mục ([3,2,1], XS). Nó được phân loại bằng việc hoán đổi 2 và 3, sau đó là 3 và 1, và cuối cùng là 2 và 1 để đưa ra một danh sách đã sắp xếp [1,2,3]. Nó cũng có thể được phân loại bằng việc hoán đổi đầu tiên 2,1, sau đó hoán đổi 3 và 1, và cuối cùng là hoán đổi 3 và 2 để có được lời giải tương tự nhau. Chúng ta biết chỉ có duy nhất một danh sách được sắp xếp. Do đó không có điểm nào trong quá trình tìm kiếm trao đổi khác được tiến hành. Nó có thể chỉ ra địa điểm của nhát cắt sau việc kiểm tra X>Y. Qua sớm để biết rằng việc trao đổi là cần thiết. Một chương trình trao đổi với nhát cắt được đưa ra ở chương trình 11.5.

Nhũng nhát cắt thêm vào chương trình mô tả trong bản này không thay đổi khai báo nghĩa của chúng; tất cả những lời giải cho truy vấn đưa ra được tìm thấy. Ngược lai, loại bỏ những nhát cắt tương tự sẽ không ảnh hưởng đến nghĩa của chương trình. Không phải lúc nào cũng là trường hợp đó. Sự khác biệt giữa nhát cắt xanh và nhát cắt đỏ đã được tạo ra trong phần này. Nhát cắt xanh được chú ý hơn. Việc thêm vào và loại đi nhát cắt xanh từ một chương trình không ảnh hưởng tới nghĩa của chương trình. Nhát cắt xanh loại bớt duy nhất hướng tính toán mà không cho phép có lời giải mới. Nhát cắt không phải là xanh thì là đỏ.

Sort (XS, YS)  YS là một danhh sách sắp xếp số nguyên XS Sort (XS,YS)  Append (AS, [X,Y|BS],XS1), X>Y !, Append (AS, [X, Y|BS],XS1), Sort (XS1,YS) Sort (XS, YS) 

Ordered (XS), !

Ordered (XS)  Xem chương trình 3.20

Chương trình 11.5: Sắp xếp hoán đổi

Nhát cắt tương tác với hệ thống các thuộc tính as call và ;, được giới thiệu trong chương 10, và với những thuộc tính not được giới thiệu sau trong chương này. Câu hởi Scope là gì sẽ được cắt nghĩa, đó là, một điểm chọn sẽ bị ảnh hưởng. Từ thủ đoạn sử dụng nhát cắt không được tán thành trong cuốn sách này. Chúng ta hoãn thảo luận về phạm vi của nhát cắt cho đến chương 17.

Bài tập cho phần 11.1

(i) Thêm nhát cắt để phân chia chương trình từ quicksort,3.22 (adsbygoogle = window.adsbygoogle || []).push({});

(ii) Thêm nhát cắt để làm chương trình khác nhau, chương trình 3.30 (iii) Thêm nhát cát vào chương trình sắp xếp chèn, chương trình 3.21 11.2. Tối ưu đệ quy cuối.

Như chú ý trong mục 8.3, sự khác biệt chính từ một điểm biểu thị giữa đệ quy và nhắc lại là do đệ quy qui đinhl, nhìn chung, đệ quy được gọi tới để thực hiện khỏang cách về số lượng, ở bất kỳ nơi nào thì sự nhắc lại được thực hiện cố định, phụ thuộc vào số lượng những lần nhắc lại.

Chương trình đệ quy định nghĩa hệ qur tự do được quan tâm một cách hài lòng và lịch sự hơn những lần lặp giống nhau đã định nghĩa trong mục lặp và biến cục bộ. Tuy nhiên, thứ tự về độ lớn trong khoảng trống phức tạp giường như là một giá trị không được chấp nhận để hợp với nguyên tắc thẩm mỹ. May mắn thay, ở đó có một lớp chương trình đệ quy, chính xác là chúng được dịch cụ thể thành sự lặp đó, có thể được thực hiện trong khoảng cố định.

Phương pháp bổ sung tiết kiệm khoảng trống được gọi là chương trình đệ quy tối ưu, hay chính xác hơn gọi là tối ưu cuối. Bằng trực giác, ý kiến về chương trình đệ quy tối ưu để thức hiện một chương trình đệ quy khi nó có tính chất nhắc lại.

Quan tâm tới sự biến đổi của mục S sử sụng mệnh đề sau: A’  B1, B2,…,Bn

Với sự thống nhất chung nhất Ө. Sự tối ưu có khả năng thích hợp cho lần gọi cuối trong phần thân của Bn. Nó dùng lại khu chỉ định điểm gốc A và điểm mới Bn.

Điều kiện chính để áp dụng sự tối ưu là có một điểm lựa chọn nào đã được loại trừ từ thời gian điểm gốc A biến đổi tới thời gian điểm cuối Bn được biến đổi trong mệnh đề này. Nói cách khác, A không có mệnh đề khác cho việc biến đổi loại

trừ, và không có điểm lựa chọn nào được loại trừ trong việc tính toán loại trừ Bn, cụ thể là, tính toán về việc nối tiếp các điểm (B1, B2,…,Bn-1)Ө, là mặc định.

Bổ xung vào phần cuối của đệ quy tối ưu có thể nhận ra phạm vi cho phép trong thời gian chạy liệu điều kiện này có xảy ra, bằng việc so sánh mối quan hệ quay lui kết hợp với điểm Bn và A. Trong mệnh đề chú thích, một phương pháp bổ sung khác cũng tương tác một cách chặt chẽ với phần cuối của đệ quy tối ưu và nâng cao khả năng bổ sung để xem điều kiện xảy ra. Chú thích thể hiện việc phân tích điểm, để phát hiện xem mệnh đề nào thích hợp cho việc biến đổi , trước cố gắng thực sự tạo nên thống nhất. Tiêu biểu là, chú thích được hoàn thành trong kiểu và giá trị của đối số đầu tiên của mục.

Chú ý tới chương trình viết thêm sau:

Append ([X|XS], YS, [X|ZS])  append (XS, YS, ZS) Append ([ ], YS,YS).

Nếu nó được sử dụng để hoàn thành thêm hai danh sách thì trong thời gian đó mục tiêu viết lại đệ quy được thực hiện, điều kiện cho phần cuối của đệ quy được tiến hành. Không có mệnh đề nào khác thích hợp với mục tiêu gốc (nếu như đối số đầu tiên thống nhất với [X|XS], chắc chắn nó sẽ không thống nhất với [ ], từ khi chúng ta làm ra vẻ rằng đối số đầu tiên là một danh sách hoàn thành. Không còn điểm nào khác trong thân chương trình bên cạnh chương trình viết thêm, vì vậy điều kiện thứ hai tiếp tục trống rỗng.

Tuy nhiên, việc bổ sung là để hiểu về ứng dụng tối ưu, nó cần thiết để biết rằng mệnh đề thứ hai là không thích hợp, mặc dù đã thực sự cố gắng. Chú thích này có hiệu lực thực hiện.Bằng việc phân tích yếu tố đầu tiên, nó cho ta biết rằng mệnh đề thứ hai sẽ lỗi trước khi thử nó, và áp dụng tối ưu trong đệ quy gọi là viết thêm.

Không phải tất cả sự bổ sung cung cấp mối liên hệ và cũng không phải mọi trường hợp của tiền định được tìm ra bởi liên hệ máy móc. Do đó người lập trình quan tâm tới việc bổ sung để chứng minh phần cuối của đệ quy tối ưu để biết rằng điều kiện áp dụng nó vẫn tiếp tục.

Có một phương pháp tôt để thực hiện nó: Thêm nhát cắt trước điểm cuối cùng của một mệnh đề, trong phần cuối của đệ quy tối ưu sẽ luôn được áp dụng, như là:

A1  B1, B2,…!,Bn

Nhát cắt lược bớt luân phiên lược bớt cả hai mệnh đề từ diểm gốc A, và bất kỳ việc luân phiên tính toán (B1, B2,…,Bn-1)Ө.

Nhìn chung, nó sẽ không có khả năng để trả lưoif nhát cắt thực sự là xanh hoặc đỏ, và việc đánh giá của những người lập trình sẽ được áp dụng.

Cần phải chú ý rằng hiệu quả của phần cuối đệ quy tối ưu là nâng cao khi đi kèn với người sưu tầm dữ liệu vô nghĩa. Theo phát biểu phủ định, tối ưu sẽ không đáng kể nếu không có sự sưu tầm dữ liệu vô nghĩa. Lý do là hầu hết phần cuối của chương trình đệ quy phát sinh một vài cấu trúc dữ liệu trong mỗi lần nhắc lại. Hầu hết trong số những cấu trúc này mang tính tạm thời và có thể được phục hồi (nhìn

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