Chúng tôi sẽ cố gắng viết một chương trình ghi nhớ những gì nó đã làm cho đến nay và tiếp tục hướng tới mục tiêu của nó nếu bị hủy bỏ chạy lại. Đây là một chương trình ngoan cường . Nó sẽ sử dụng Bộ nhớ không biến động để lưu trữ thông tin qua các lần chạy, như một số cits , là các bit có tài khoản về những gì xảy ra khi hủy bỏ. Tôi đã từng phỏng đoán rằng với N cits , bất kỳ mục tiêu nào dài đến 2 (NK) đều có thể đạt được, đối với một số cố định nhỏ K. Bây giờ tôi đang nghiêng về suy nghĩ mục tiêu không thể đạt được :-(
Nó được yêu cầu một chương trình ngoan cường với mục tiêu 01
, đó đã là một mục tiêu không tầm thường ; hoặc một bằng chứng nghiêm ngặt về sự bất khả thi.
Một chương trình ngoan cường được định nghĩa là một chương trình:
- Bất cứ khi nào chạy , thực thi bắt đầu từ cùng một điểm nhập cảnh, không có đầu vào và có thể chia sẻ thông tin qua các lần chạy độc quyền bằng phương tiện của
N
cits (được xác định bên dưới); mọi thông tin khác đều có cùng một nội dung khi bắt đầu mỗi lần chạy, có nội dung không thể đoán trước khi bắt đầu chạy, không thể thay đổi (chính chương trình) hoặc không thể đọc được ( đầu ra và giá trị trước đó ). - Có phải là khi chạy trong một phiên, nó có thể dừng lại một cách rõ rệt (sử dụng một tính năng của ngôn ngữ của nó), trong một số độ trễ bị ràng buộc kể từ khi bắt đầu chạy, trừ khi bị hủy bỏ trước khi tạm dừng; hủy bỏ xảy ra bất kỳ lúc nào tùy ý và ngăn hoạt động cho đến khi chạy khác (nếu có).
- Có phải là sự kết hợp theo thứ tự thời gian của các ký tự mà nó tạo ra là cùng một chuỗi hữu hạn ( mục tiêu ) trong bất kỳ phiên phân xử tùy ý nào, bao gồm ít nhất một lần chạy mà chương trình bị bỏ chạy cho đến khi dừng.
- Kết quả đầu ra ký tự sử dụng một thiết bị nguyên tử : nhận được một giá trị giữa 0 1 2 3 đặt bởi chương trình, và kết quả đầu ra
0
(resp.1
) Cho các giá trị trong 0 hoặc 2 (resp 1 hoặc 3) khi và chỉ khi giá trị đó là khác biệt so với trước đây giá trị đặt, giả sử là 0 cho lần đặt đầu tiên trong phiên.
Chương trình ngoan cường tồn tại! Bất kỳ chương trình nào chỉ đơn giản đặt một số lần cố định một giá trị cố định hợp lệ, sau đó tạm dừng, sẽ kiên trì với mục tiêu là trống (nếu số hoặc giá trị là 0), 0
(nếu số là dương và giá trị là 2) hoặc 1
(nếu không). Bất kỳ mục tiêu dài hơn yêu cầu NVM.
Mỗi cit mô hình một bit NVM với tài khoản cho hiệu ứng của một lần chạy bị hủy bỏ trong khi ghi vào cit. Tại bất kỳ thời điểm nào, một cit là ở một trong ba trạng thái có thể 0
1
hoặc U
. Giá trị đọc từ một cit luôn là 0 hoặc 1; nó cũng phù hợp với nhà nước trừ khi U
. Một cit được khởi tạo để trạng thái 0
trước khi chạy lần đầu tiên trong một phiên và nếu không thì chỉ thay đổi trạng thái khi một lệnh ghi vào nó được lệnh bởi chương trình, có hiệu lực tùy thuộc vào những gì được viết, liệu lần chạy đó có bị hủy bỏ trong quá trình ghi hay không và từ tiểu bang cũ của cit:
Former state 0 1 U Rationale given by hardware guru
Operation
Write 0 completed 0 0 0 Discharging returns cit to 0
Write 0 aborted 0 U U Aborted discharging leaves cit unspecified
Write 1 aborted U 1 U Aborted charging leaves cit unspecified
Write 1 completed 1 1 U Charging a non-discharged cit is inhibited
Các HAL cho trên được khai báo trong C như sau:
/* file "hal.h" unspecified parameter values give undefined behavior */
#define N 26 /* number of cits */
void p(unsigned v); /* put value v; v<4 */
unsigned r(unsigned i); /* read from cit at i; returns 0 or 1; i<N. */
void w(unsigned i, unsigned b); /* write b to cit at i; b is 0 or 1; i<N. */
/* all functions return in bounded time unless aborted */
Nỗ lực đầu tiên của chúng tôi tại một chương trình ngoan cường với mục tiêu 01
là:
#include "hal.h" /* discount this line's length */
main(){ /* entry point, no parameters or input */
if (r(3)==0) /* cit 3 read as 0, that is state 0 or U */
w(3,0), /* write 0 to cit 3, to ensure state 0 */
p(2); /* put 2 with output '0' initially */
w(3,1), /* mark we have output '0' (trouble spot!) */
p(1); /* put 1 with output '1' */
} /* halt (but we can be re-run) */
Murphy thực hiện một phiên đầu tiên, khiến cuộc chạy đầu tiên tạm dừng và kết thúc phiên; đầu ra của phiên là đầu ra của một lần chạy 01
; càng xa càng tốt.
Trong một phiên khác, Murphy hủy bỏ lần chạy đầu tiên trong khi w(3,1)
để lại trạng thái U
; trong lần chạy thứ hai, Murphy quyết định đó r(3)
là 1 (cit đang ở trạng thái U
) và khiến chương trình bị dừng (chú ý cách w(3,1)
không thay đổi trạng thái của cit); trong lần chạy thứ ba, Murphy quyết định r(3)
là 0, hủy bỏ sau đó p(2)
và kết thúc phiên.
Đầu ra được nối của phiên thứ hai là 010
(một ký tự cho mỗi lần chạy) nhưng khác với 01
phiên đầu tiên, do đó chương trình không ngoan cường, vì điều kiện 3 không được đáp ứng.
Ngôn ngữ là miễn phí, điều chỉnh giao diện C phù hợp với ngôn ngữ. Tôi sẽ chọn câu trả lời tốt nhất dựa trên số lượng trích dẫn thấp nhất được sử dụng; sau đó số trường hợp ghi thấp nhất từ trường hợp chạy đến đầu ra (hoặc tạm dừng nếu không có đầu ra); sau đó số lần ghi thấp nhất trước khi tạm dừng trong một phiên không hủy bỏ; sau đó chương trình ngắn nhất. Chỉ đếm mã cuộc gọi, không phải giao diện hoặc cách thực hiện, không cần thiết. Một bằng chứng nghiêm ngặt về sự bất khả thi sẽ loại bỏ bất kỳ chương trình nào (và gây ngạc nhiên cho tôi) ; Tôi sẽ chọn đơn giản nhất để nắm bắt.
Vui lòng kiểm tra kỹ xem chương trình có thực sự đạt được mục tiêu theo 3 hay không, bất kể số lượng và nội dung của việc hủy bỏ; thật khó!
Cập nhật: Tôi đã thêm một câu trả lời ứng cử viên . Hãy thoải mái để đánh bại nó. Oh, hammar đã làm điều đó trong vài phút bằng một chương trình có hệ thống!
Tình trạng : Cho đến nay chúng tôi không có giải pháp; biết chắc chắn rằng không có giải pháp nào với 1 hoặc 2 cits; nhưng không có bằng chứng về sự bất khả thi với 3 cits trở lên. Tuyên bố chưa được tìm thấy mơ hồ. Vấn đề sẽ có một giải pháp nếu chúng ta thay đổi ma trận cit một chút (ví dụ: đặt ở 1 ở dưới cùng bên phải, trong trường hợp ví dụ trên là chính xác).