การเขียนคำใหม่และการจับคู่รูปแบบแตกต่างกันอย่างไร


25

เนื่องจากไม่มีคำตอบที่ Lambda the Ultimateฉันลองที่นี่อีกครั้ง: ระบบการเขียนคำซ้ำถูกนำมาใช้เป็นตัวอย่างในทฤษฎีบทอัตโนมัติที่พิสูจน์การคำนวณเชิงสัญลักษณ์และแน่นอนเพื่อกำหนดไวยากรณ์อย่างเป็นทางการ มีบางภาษาโปรแกรมที่อยู่ในระยะการเขียนใหม่มี แต่เท่าที่ผมเข้าใจแนวคิดเป็นที่รู้จักกันมากขึ้นเช่นจับคู่รูปแบบ การจับคู่รูปแบบถูกใช้อย่างมากในภาษาที่ใช้งานได้ Barry Jay ได้สร้างทฤษฎีทั้งหมดที่เรียกว่าpattern แคลคูลัสแต่เขากล่าวถึงการเขียนคำซ้ำ ๆ ฉันมีความรู้สึกว่าพวกเขาทั้งหมดอ้างถึงแนวคิดพื้นฐานเดียวกันดังนั้นคุณสามารถใช้การเขียนคำซ้ำและการจับคู่รูปแบบเหมือนกันได้หรือไม่

คำตอบ:


26

วิธีหนึ่งในการดูแนวคิดทั้งสองนี้คือการกล่าวว่าการจับคู่รูปแบบเป็นคุณลักษณะของภาษาโปรแกรมสำหรับการรวมการเลือกปฏิบัติบนคอนสตรัคเตอร์และคำที่ทำลาย (ในขณะเดียวกันการเลือกและการตั้งชื่อส่วนคำศัพท์เฉพาะ) อย่างปลอดภัยกะทัดรัดและมีประสิทธิภาพ การวิจัยเกี่ยวกับการจับคู่รูปแบบโดยทั่วไปมุ่งเน้นที่ประสิทธิภาพการใช้งานเช่นวิธีการลดจำนวนของการเปรียบเทียบกลไกการจับคู่ที่ต้องทำ

ในทางตรงกันข้ามคำว่าการเขียนใหม่เป็นแบบจำลองทั่วไปของการคำนวณที่ตรวจสอบวิธีการที่หลากหลาย (อาจไม่ใช่แบบกำหนดค่าได้) ของการแทนที่คำย่อยของการแสดงออกทางวากยสัมพันธ์ การวิจัยเกี่ยวกับระบบการเขียนคำใหม่มักเกี่ยวกับคุณสมบัติเชิงนามธรรมของระบบการเขียนซ้ำเช่นการบรรจบกันการกำหนดและการเลิกจ้างและโดยเฉพาะอย่างยิ่งเกี่ยวกับวิธีการที่คุณสมบัติดังกล่าวเป็นหรือไม่ได้รับการเก็บรักษาไว้โดยการดำเนินงานเชิงพีชคณิต

เห็นได้ชัดว่ามีการทับซ้อนแนวคิดระหว่างทั้งสองและความแตกต่างคือระดับดั้งเดิมมากกว่าทางเทคนิค ความแตกต่างทางเทคนิคคือคำว่าการเขียนใหม่เกิดขึ้นภายใต้บริบทโดยพลการ (เช่นกฎทำให้เกิดการเขียนซ้ำสำหรับบริบทโดยพลและการแทนที่ ) ในขณะที่ การจับคู่รูปแบบในภาษาสมัยใหม่เช่น Haskell, OCaml หรือ Scala ให้การเขียนใหม่ 'ที่ด้านบน' ของคำศัพท์เท่านั้น ฉันคิดว่าข้อ จำกัด นี้ก็เช่นกันในแคลคูลัสรูปแบบของเจย์ ให้ฉันอธิบายสิ่งที่ฉันหมายถึงโดยข้อ จำกัด นี้ ด้วยการจับคู่รูปแบบในความหมายของ OCaml, Haskell, Scala คุณจะไม่สามารถพูดอะไรได้(l,r)C[lσ]C[rσ]C[.]σ

match M with
   | C[ x :: _ ]  -> printf "%i ...\n" x
   | C[ [] ] -> printf "[]"

ที่C[.]นี่คืออะไร มันควรจะเป็นตัวแปรที่อยู่ในบริบทหนึ่งเดียว แต่ภาษาอย่าง OCaml, Haskell หรือ Scala ไม่ได้ให้ตัวแปรโปรแกรมเมอร์ที่อยู่ในบริบทของบริบท (หนึ่ง -eded) เฉพาะตัวแปรที่ช่วงค่า กล่าวอีกนัยหนึ่งในภาษาดังกล่าวคุณไม่สามารถจับคู่รูปแบบที่ตำแหน่งโดยพลการในคำศัพท์ คุณต้องระบุเส้นทางจากรูทของรูปแบบไปยังส่วนต่าง ๆ ที่คุณสนใจฉันเดาว่าเหตุผลสำคัญสำหรับการกำหนดข้อ จำกัด นี้ก็คือมิฉะนั้นการจับคู่รูปแบบจะไม่กำหนดขึ้นเนื่องจากคำอาจตรงกับรูปแบบใน มากกว่าหนึ่งวิธี ตัวอย่างเช่นคำที่(true, [9,7,4], "hello", 7)ตรงกับรูปแบบC[7]ในสองวิธีสมมติว่าC[.] อยู่ในช่วงบริบทดังกล่าว


11

ฉันคิดว่ามันไม่ถูกต้องที่จะเรียกมันว่าคำพ้องความหมาย มีการทับซ้อนกันในแง่ของการวิจัยและการใช้งาน ฉันไม่คุ้นเคยเลยกับงานของเจย์และฉันก็คุ้นเคยกับระบบการเขียนคำซ้ำดังนั้นฉันอาจจะพลาดอะไรบางอย่างไป

การจับคู่รูปแบบโดยทั่วไปเกี่ยวข้องกับปัญหาต่อไปนี้: คุณมีโครงสร้างบางอย่าง (ต้นไม้หรือรายการหรือหลายชุด) และคุณต้องการตรวจสอบว่าโครงสร้างตรงกับรูปแบบ (หรือหนึ่งในจำนวนรูปแบบ) คำถามนี้เกี่ยวข้องกับการเขียนคำซ้ำอย่างแน่นอนเพราะในระบบการเขียนคำซ้ำความจริงที่ว่าคำที่ตรงกับรูปแบบหมายความว่าคำนั้นสามารถเขียนใหม่เป็นคำที่แตกต่างกันได้ แต่ไม่ใช่การเขียนคำซ้ำกัน (อาจมีสูตรการจับคู่รูปแบบเป็นการเขียนใหม่: "คำหนึ่งคุณสามารถเขียนใหม่เพื่อจับคู่รูปแบบได้หรือไม่" แต่ฉันไม่เคยเห็นสิ่งนี้มาก่อน)

การจับคู่รูปแบบในภาษาโปรแกรมที่ใช้งานได้มีการตีความเชิงตรรกะในแง่ของการโฟกัส ( ตัวอย่างเช่น"การจับคู่รูปแบบ" ของ Krishnaswami ) ในทางกลับกันระบบการเขียนคำใหม่มักจะจับคู่โมดูโลคุณสมบัติเชิงซ้อนบางอย่างซึ่งไม่ได้มีอยู่ในภาษาการเขียนโปรแกรมที่ใช้งานได้ส่วนใหญ่ (คุณไม่สามารถจับคู่กับมัลติเซ็ตใน ML หรือ Haskell) ไม่มีเหตุผลพื้นฐานว่าทำไมการจับคู่คุณสมบัติเชิงโมดูโลไม่ควรนำเสนอในภาษาที่ใช้งานได้


1
ขอบคุณสำหรับคำตอบ. ฉันยอมรับว่าการจับคู่รูปแบบโดยทั่วไปไม่ได้มีความหมายเหมือนกันกับการเขียนคำซ้ำ แต่เป็นพื้นฐานมากกว่า แต่ถ้ามีคนบอกว่าระบบที่มีพลังการคำนวณขึ้นอยู่กับการจับคู่รูปแบบฉันไม่สามารถเห็นความแตกต่างกับระบบการเขียนคำซ้ำด้วยพลังการคำนวณ คุณสามารถยกตัวอย่างความแตกต่างระหว่าง "มีการตีความเชิงตรรกะ" และ "คุณสมบัติสมการบางอย่าง" ได้หรือไม่?
จาคอบ

"ฉันไม่เห็นความแตกต่างกับระบบการเขียนคำซ้ำด้วยพลังการคำนวณ" - ฉันไม่แน่ใจว่าสิ่งนี้หมายถึงอะไร ดังที่มาร์ตินกล่าวว่าการเขียนคำซ้ำเป็นรูปแบบการคำนวณทั่วไปและการจับคู่รูปแบบเป็นคุณลักษณะไม่ใช่รูปแบบการคำนวณ
Rob Simmons

คุณสามารถยกตัวอย่างความแตกต่างระหว่าง "มีการตีความเชิงตรรกะ" และ "คุณสมบัติสมการบางอย่าง" ได้หรือไม่? - ไม่มีความแตกต่างตื้น ๆ - มันเป็นเพียงคุณสมบัติที่แตกต่างแอปเปิ้ลและส้ม ฉันคิดว่าการเชื่อมต่อที่แท้จริงระหว่างสองสิ่งนี้อาจกลายเป็นคำถามวิจัยที่ค่อนข้างลึก Pun ด้วยการอนุมานเชิงลึก - ดูalessio.guglielmi.name/res/cos - อาจเป็นไปได้
Rob Simmons

1

(ฉันอยากจะเขียนสิ่งนี้เป็นความคิดเห็น แต่ฉันไม่สามารถทำได้ในปัจจุบัน)

ถูกต้องฉันหากฉันผิด แต่เท่าที่ผมเข้าใจอีกหนึ่งความแตกต่างระหว่างจับคู่รูปแบบและระยะเวลาการเขียนใหม่นอกเหนือจากสิ่งที่มาร์ตินเบอร์เกอร์กล่าวว่าในคำตอบที่ดีเยี่ยมของเขานั่นคือกฎรูปแบบการจับคู่มาพร้อมกับการสั่งซื้อคงที่ (ในการใช้งานเช่น Haskell's) ในขณะที่คำว่ากฎการเขียนซ้ำนี้ไม่จำเป็นต้องเป็นกรณี คุณลักษณะนี้ตามที่คาดหวังสามารถสร้างความแตกต่างได้มากเมื่อพิจารณาถึงพฤติกรรม (โดยเฉพาะการเลิกจ้าง) ของกฎ (ดู"การแนะนำอย่างอ่อนโยนต่อ Haskell รุ่น 98" ​​ส่วน 4.2หรือเป็นปัจจัย ตัวอย่างที่"Learn a a Haskell" )

ผู้คนที่มีความรู้ในทฤษฎีการเขียนใหม่จะมีมากกว่าที่จะพูดในเรื่องนั้น (ตัวอย่างเช่นการพิมพ์นั้นเหมาะสมกับการเปรียบเทียบอย่างไร) แต่ดูเหมือนว่าฉันยุติธรรมที่จะเห็นด้วยกับมาร์ตินเบอร์เกอร์ในระยะนั้น การจับคู่รูปแบบ (อย่างน้อยขณะนี้มีการใช้งานในภาษาเช่น Haskell) เท่าที่อุปกรณ์ทั้งสองสามารถดู (ค่อนข้างแห้ง) เป็นอุปกรณ์ที่ใช้กฎที่เกี่ยวข้องกับคำเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.