ใช้โอเปอเรเตอร์สำหรับชื่อภาคแสดง
เป็นไปได้ที่จะให้ตัวดำเนินการเพรดิเคตเป็นชื่อตราบใดที่โอเปอเรเตอร์เป็นหนึ่งในโอเปอเรเตอร์ที่กำหนดไว้ล่วงหน้า (อยู่ที่นี่ ) และยังไม่ได้กำหนดเป็นเพรดิเคต สิ่งนี้ช่วยประหยัดทั้งสองไบต์เมื่อกำหนดและเรียกใช้เพรดิเคตเนื่องจากเพรดิเคตตัวดำเนินการไม่จำเป็นต้องเขียนในname(arg1,arg2,etc..)
รูปแบบปกติและสามารถเรียกได้ว่าใครจะคาดหวังกับตัวดำเนินการ
สำหรับการโต้แย้งหนึ่งและสองเพรดิเคตพวกเขาสามารถให้ชื่อของผู้ประกอบการเอกและไบนารีตามลำดับ สำหรับเพรดิเคต arity ที่สูงขึ้นเรายังสามารถหลีกเลี่ยงวงเล็บโดยใช้การจับคู่รูปแบบ ตัวอย่างเช่นถ้าเรามีมูลฐานA+B+C:-...
, เปิดฉากจะใช้ของผู้ประกอบการมีความสำคัญและเชื่อมโยงกันกฎที่จะเปลี่ยนมันเป็นซึ่งเป็นคำกริยาผู้ประกอบการที่อาร์กิวเมนต์แรกเป็นรูปแบบการจับคู่กับ(A+B)+C:-...
A+B
หรือA-B+C*D:-...
ซึ่งจะกลายเป็น(A-B)+(C*D)
ดังนั้นอาร์กิวเมนต์แรกของมันคือรูปแบบการจับคู่กับและครั้งที่สองของมันคือรูปแบบการจับคู่กับA-B
C*D
ตัวอย่าง
_+_+_.
A-B+C*D:-between(A,B,C),C+D.
\X:-X>1,X<10.
X+Y:-length(Y,X),member(X,Y).
5+[10,5,3,2,5],a+b+c,0-20+X*[2,4,6,5,40],\9.
ผลลัพธ์จะเป็น X = 5.
ลองออนไลน์!
ควันหลง
เนื่องจากDCGsเป็นน้ำตาลซินแทคติคสำหรับเพรดิเคตพวกเขาก็สามารถให้ชื่อได้เช่นกัน สิ่งนี้ทำงานได้อย่างที่คาดไว้เมื่อเรียกพวกเขาเป็น DCG ทั้งจาก DCG หรือใช้ภาคphrase
แสดงหรืออื่น ๆ ที่ออกแบบมาเพื่อทำงานกับ DCG เมื่อเรียกพวกเขาเป็นวงเล็บภาคแสดงจะต้อง (เช่นA+B-->...
ต้องเรียกว่าชอบ+(A,B,...)
) เนื่องจากภาค DCG ใช้สองข้อโต้แย้งเพิ่มเติมสำหรับรายการที่แตกต่างของพวกเขา สำหรับโอเปอเรเตอร์ชื่อ DCGs ที่มีมากกว่าสองข้อโต้แย้งโดยใช้การจับคู่รูปแบบของตัวดำเนินการนั้นเป็นสิ่งสำคัญเพื่อให้แน่ใจว่าเมื่อเรียกมันว่าเพรดิเคตว่าตัวดำเนินการที่จับคู่รูปแบบนั้นถูกต้อง
การให้ชื่อโอเปอเรเตอร์กับ DCG ที่ไม่มีการขัดแย้งเพิ่มเติมอาจมีประโยชน์หากคุณต้องการเรียกมันในโปรแกรมของคุณตั้งแต่นั้นคุณสามารถทำได้โดยไม่ต้องใช้วงเล็บ จำเป็นต้องมีข้อควรระวังเนื่องจากอาจเป็นกรณีที่สิ่งที่คุณบันทึกไว้ในวงเล็บคุณสามารถสูญเสียการเว้นวรรคเพิ่มที่จำเป็นในการแยกวิเคราะห์ตัวดำเนินการที่อยู่ติดกัน
ตัวอย่าง
/ -->a+b+X,X+d+e.
A+B+C-->[A],[B],[C].
X/[],member(c,X),phrase(f+o+o,Y),+(b+a,r,Z,[]).
ผลผลิตจะได้
X = [a, b, c, c, d, e],
Y = [f, o, o],
Z = [b, a, r].
ลองออนไลน์!
คำเตือน
ด้วยโอเปอเรเตอร์ unary +
และ-
Prolog จะตีความ+20
หรือ-20
เป็นตัวเลขแทนการเรียกไปยัง+/1
หรือเพ-/1
รดิเคต เพรดิเคตที่กำหนดให้เป็นเอกภาพ+
หรือ-
เป็นชื่อยังสามารถเรียกใช้บนตัวเลขโดยใช้วงเล็บ ( +(20)
, -(20)
) หากหลีกเลี่ยงไบต์พิเศษจากวงเล็บเป็นที่พึงปรารถนาประกอบการเอกภาคอื่น ๆ เช่น\
, $
ฯลฯ สามารถนำมาใช้เป็นชื่อแทน
การรวมกันของการจับคู่รูปแบบและตัวดำเนินการที่ชื่อว่าเพรดิเคตนั้นไม่สมบูรณ์โดยไม่มีข้อบกพร่อง หากคุณมีเพรดิเคตสองตัวที่มีโอเปอเรเตอร์เดียวกับชื่อและด้วยการจับคู่รูปแบบจะมีความเข้มงวดกว่าอีกแบบหนึ่งโดยทั่วไปแล้วจะมีการเรียกทั่วไปที่ใหญ่กว่าก่อน . ยกตัวอย่างเช่นในตัวอย่างข้างต้นถ้าล้มเหลวเพื่อให้ตรงกับการป้อนข้อมูลของมันแล้วเปิดฉากจะพยายามโทรA-B+C*D
X+Y
ซึ่งจะส่งผลในข้อผิดพลาดเนื่องจากlength/2
ต้องให้เป็นจำนวนเต็มซึ่งมันจะไม่เป็นเพราะมันจะอยู่ในรูปแบบY
C*D
สิ่งนี้สามารถหลีกเลี่ยงได้ง่ายๆโดยตรวจสอบให้แน่ใจว่าไม่มีเพรดิเคตสองตัวที่มีตัวดำเนินการเหมือนกับชื่อของพวกเขาหรือถ้ามันล้มเหลวจากนั้นใช้การตัดและสั่งซื้ออย่างระมัดระวัง
prolog
แท็กจะไม่ได้ผลครับ นอกจากว่าเราจะมีความท้าทายล่ามล่ามเราไม่ต้องการ