2015-10-06 19 views
7

min thường được xác định trên giải tích lambda untyped như (sử dụng Caramel's syntax):Có thể thực hiện `max` hiệu quả trên phép tính lambda chưa được phân loại không?

sub a b = (b pred a) 
<= a b = (is_zero (sub b a)) 
min a b = (<= a b a b) 

Đây là khủng khiếp không hiệu quả. Sub là bậc hai, vì nó áp dụng pred (tuyến tính) b lần. Có một thực hiện nhiều hiệu quả hơn min như:

min a b succ zero = (a a_succ (const zero) (b b_succ (const zero)))) 
    a_succ pred cont = (cont pred) 
    b_succ pred cont = (succ (cont pred)) 

này kéo khóa thông qua cả hai con số trong một phong cách tiếp nối-qua cho đến khi không đầu tiên là đạt. Bây giờ, tôi đang cố gắng để tìm thấy một max đó là hiệu quả như min, có các thuộc tính sau:

  1. ab được sử dụng cùng một lúc nhất trên cơ thể của hàm.

  2. Biểu mẫu có dạng beta bình thường (tức là, không sử dụng bộ phối hợp điểm cố định đang chuẩn hóa mạnh).

Định nghĩa max này tồn tại?

+0

Tôi nhớ Loic Colson đã điều tra loại vấn đề này: Hệ thống T, gọi theo giá trị và vấn đề tối thiểu, TCS 206, 1998. Tôi đã có một cái nhìn nhưng không thể tìm thấy bất cứ điều gì cụ thể về tối đa. –

+0

@AndreaAsperti ah hóa ra vấn đề không phải là khó khăn, hãy để tôi trả lời nó – MaiaVictor

+0

@AndreaAsperti oh chỉ nhận thấy tôi đã hỏi 'a' và' b' chỉ được sử dụng một lần. Chết tiệt tôi và những câu hỏi đòi hỏi của tôi. – MaiaVictor

Trả lời

1

Chỉ cần cho các hồ sơ, nếu ab có thể được sử dụng hai lần (tức là, nó sẽ bao gồm một nút dup trên lưới tương tác), có một giải pháp đơn giản:

true a b = a 
false a b = b 
const a b = a 

-- less than or equal 
lte a b = (go a true (go b false)) 
    go = (num result -> (num (pred cont -> (cont pred)) (const result))) 

min = (a b -> (lte a b a b)) 
max = (a b -> (lte a b b a)) 

-- A simple test 
main = (max (max 3 14) (max 2 13)) 

Nhưng tôi yêu cầu không có sự trùng lặp (tức là, lte a b b a không được phép) vì vậy tôi vẫn không biết nếu điều đó là có thể.

Các vấn đề liên quan