ลองนึกภาพภาษาโปรแกรมที่ใช้งานได้ซึ่งมีชนิดข้อมูลเป็นสเกลาร์ตัวเลขและการซ้อนข้อมูลแบบอาเรย์โดยพลการ ภาษาขาดวิธีการทำซ้ำใด ๆ ที่ไม่ จำกัด ดังนั้นสิ่งต่อไปนี้จะไม่ได้รับอนุญาต:
- ชัดเจนลูป (ไม่ค่อยได้ใช้โดยไม่มีผลข้างเคียง)
- เรียกซ้ำ
- ฟังก์ชั่นชั้นหนึ่งโดยพลการ (ไม่มี y-combinator)
อย่างไรก็ตามภาษานี้มี:
- ฟังก์ชั่นระดับบนสุด
- ขอบเขตที่ จำกัด ให้การเชื่อม
- การควบคุมการไหลของกิ่ง
- ฟังก์ชันสเกลาร์คณิตศาสตร์และตรรกะทั่วไป
- ตัวสร้างอาร์เรย์แบบง่าย ๆ เช่น fill (n, x) ซึ่งสร้างอาร์เรย์ n-element ที่มีค่าเหมือนกัน x
- สิ่งสำคัญที่สุด: ชุด จำกัด ของตัวดำเนินการลำดับสูงกว่าซึ่งดำเนินการวนซ้ำที่มีโครงสร้างแบบขนาน (เช่นแผนที่ลดสแกนทุกคู่)
หากต้องการเฉพาะเจาะจงมากขึ้นเกี่ยวกับตัวดำเนินการขนานของข้อมูล:
- y = แผนที่ (f, x) => y [i] = f [i]
- y = ลด (f, a, x) => y = f (a, f (y [p [0]], f (y [p [1]], ... ))) สำหรับการเปลี่ยนแปลง p
- y = สแกน (f, a, x) => y [i] = ลด (f, a, y [0 ... i-1])
- y = ทุกคู่ (f, x, y) => y [i, j] = f (x [i], y [j])
เราสามารถมีตัวดำเนินการอื่นได้เช่นกัน แต่เพื่อให้มีคุณสมบัติพวกเขาควรมีเวลาทำงานพหุนามสามารถนำไปใช้งานภายใต้รูปแบบการคำนวณข้อมูลแบบขนานที่เหมาะสมและใช้ในพื้นที่พหุนามมากที่สุด
เห็นได้ชัดว่ามีโครงสร้างบางอย่างที่ไม่สามารถแสดงในภาษานี้ได้เช่น:
while f(x) > tol:
x <- update(x)
เราสามารถแสดงอะไรในระบบนี้ เรา จำกัด เฉพาะปัญหาการค้นหาใน FP หรือไม่ เราสามารถจับอัลกอริธึมเวลาพหุนามทั้งหมดได้หรือไม่? นอกจากนี้มีชุดตัวดำเนินการขั้นต่ำสำหรับคลาสนี้หรือไม่