ใช้เป้าหมายซ้ำซ้อนในการค้นหา


12

(ตามข้อเสนอแนะของ @repeat ) พิจารณาเคียวรีของโปรแกรมแท้1 ?- G_0.จะมีประโยชน์อย่างไรถ้ามีคิวรี่ใด?- G_0, G_0.บ้าง?

เชิงอรรถ
1 ไม่มี tabling (เพื่อความปลอดภัย) ข้อ จำกัด ใช้ได้
โพสต์ก่อนหน้าในเรื่อง


กำลังสองจำนวนผลลัพธ์?
Willem Van Onsem

1
ฉันคิดว่าจะไม่มีการเก็บข้อมูลสถานะใด ๆ จากการทำงานอย่างต่อเนื่องของเป้าหมาย กล่าวอีกนัยหนึ่งไม่อนุญาตให้มีการแปรผันของคำถามเช่น?- G_0(State), G_0(State).ไม่มีสถานะใดถูกส่งผ่านไปยังสแต็กจากผลลัพธ์ของเป้าหมายแรกไปสู่เป้าหมายที่สอง?
Guy Coder

1
G_0อาจเป็นเป้าหมายใด ๆ (บริสุทธิ์) รวมถึงพูดG_0 = append(Xs,Ys,Zs)
เท็จ

1
@GuyCoder: ต้องการการเชื่อมต่อ (ด้วยG_0;G_0คนหนึ่งอาจมีผลข้างเคียงหรือการทดสอบประสิทธิภาพการทำงาน / แคช / ปัญหา tabeling)
เท็จ

1
BTW แทนที่จะG_0(State),G_0(State)เป็นหนึ่งแทนที่จะเขียนcall(G_1,State), call(G_1,State)
เท็จ

คำตอบ:


3

แบบสอบถาม?- G_0, G_0.ช่วยระบุคำตอบที่ซ้ำซ้อน?- G_0.

ต้องการทำเช่นนั้นก็พอเพียงที่จะเปรียบเทียบจำนวนของคำตอบของกับจำนวนของคำตอบของ?- G_0. ?- G_0, G_0.ไม่จำเป็นต้องเก็บคำตอบเหล่านั้น (ซึ่งเป็นแหล่งที่มาของข้อผิดพลาดอยู่แล้ว) เพียงสองจำนวนเต็มพอเพียง! หากพวกเขาเท่ากันก็ไม่มีความซ้ำซ้อน แต่ถ้า?- G_0, G_0.มีคำตอบเพิ่มเติมแสดงว่ามีความซ้ำซ้อนอยู่บ้าง นี่คือตัวอย่าง:

p(f(_,a)).
p(f(b,_)).

?- p(X).
   X = f(_A, a)
;  X = f(b, _A).  % two answers

?- p(X), p(X).
   X = f(_A, a) 
;  X = f(b, a)
;  X = f(b, a)
;  X = f(b, _A).   % four answers
                   % thus p(X) contains redundancies

... และตอนนี้เราจะแก้ไขสิ่งนี้:

p(f(B,a)) :-
   dif(B, b).
p(f(b,_)).

?- p(X).
   X = f(_A, a), dif(_A, b)
;  X = f(b, _A).

?- p(X), p(X).
   X = f(_A, a), dif(_A, b), dif(_A, b).
;  X = f(b, _A).    % again two answers, thus no redundancy

ไม่จำเป็นต้องตรวจสอบข้อ จำกัด ที่เกี่ยวข้องด้วยตนเอง

call_nth/2นี้สามารถขยายเพิ่มเติมได้เมื่อเรากำลังอย่างชัดเจนเพื่อค้นหาคำตอบที่ซ้ำซ้อนเพียงแค่ใช้

?- G_0, call_nth(G_0, 2).

1

พิจารณาการสืบค้นของโปรแกรมแท้ 1? - G_0 จะใช้อะไรถ้ามีการสอบถามใด ๆ - G_0, G_0 มี?

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

ฉันสามารถตระหนักถึงปัญหา GC (กองซ้อน / กองมากเกินไป) เมื่อแบบสอบถามเป็นทรัพยากรโลภและตัวเลือกข้างต้นปิด (เช่นเมื่อตรวจแก้จุดบกพร่อง)

ฉันคิดว่าการโทรครั้งที่สองซ้ำซ้อน (สำหรับโปรแกรมที่แท้จริง) และควรถูกกำจัดโดยคอมไพเลอร์

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