ไขปริศนาในอารัมภบท - สร้างวิธีแก้ปัญหาด้วยข้อ จำกัด หรือไม่?

ฉันกำลังใช้คำนำเพื่อพยายามไขปริศนาคาคุโระ ฉันมีรายการกฎลักษณะนี้ โดยที่ R และ C เป็นตัวแทนของแถวและจุดเริ่มต้นของแต่ละกล่อง L แทนความยาว และ S คือผลรวมของตัวเลขในแถว

 % across(R, C, L, S)
 across(2,4,2,4).
 across(2,10,2,4).  
 across(3,4,4,12).
 across(3,10,2,6).
 across(4,3,2,6).

เท่าที่ฉันสามารถบอกได้ ในการไขปริศนาโดยใช้ข้อจำกัด สำหรับแต่ละองค์ประกอบ L ฉันจะต้องค้นหาตัวเลขที่แตกต่างกันระหว่าง 1 ถึง 9 ซึ่งเมื่อรวมกันแล้วจะเท่ากับ S ฉันกำลังดิ้นรนมากที่จะหาคำตอบนี้ รหัสที่ฉันมีจนถึงตอนนี้คือ:

solveAcross(Solution) :-
    findall([R,C,L,S], across(R,C,L,S), List), 
    Solution = length(List, L),
    Solution ins 1..9,
    all_distinct(Solution),
    labeling([], Solution).

แต่ทั้งหมดนี้กลับเป็นเท็จ

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


person AgarAgar    schedule 07.04.2016    source แหล่งที่มา
comment
Solution = length(List, L) และ Solution = 1..9 หมายถึงอะไร   -  person lurker    schedule 07.04.2016
comment
พิจารณาเพียงการรวมกันของสองเป้าหมาย Solution = length(List, L) และ Solution = 1..9 ซึ่งทั้งสองเกิดขึ้นในโปรแกรมของคุณ แน่นอนว่า การเชื่อมนี้เพียงอย่างเดียวจะล้มเหลวอยู่แล้ว เนื่องจาก 1..9 และ length(List, L) ไม่รวมกันเป็นหนึ่งเดียว   -  person mat    schedule 07.04.2016
comment
@lurker ขออภัยที่ควรจะเป็น Solution ใน 1..9 ซึ่งหมายความว่าโซลูชันที่สร้างขึ้นจะต้องอยู่ระหว่าง 1 ถึง 9 Solution = length(List, L) ฉันคิดว่าจะสร้างรายการว่างความยาว L แต่พิมพ์สิ่งนี้ออกมา ดูเหมือนจะไม่ใช่สิ่งที่ฉันอยากทำเพื่อบรรลุเป้าหมายอยู่แล้ว   -  person AgarAgar    schedule 07.04.2016
comment
Solution = length(List, L) รวมคำศัพท์ length(List, L) เข้ากับตัวแปร Solution ในคำนำ คุณไม่ได้กำหนดผลลัพธ์ของภาคแสดงโดยใช้ = เช่นเดียวกับที่คุณทำในภาษาอื่นๆ หากคุณต้องการให้รายการมีความยาว L และชื่อของรายการเป็น Solution คุณก็แค่ทำ length(Solution, L) หากคุณต้องการให้ Solution มีความยาวเท่ากับ List คุณต้องทำ length(List, Len), length(Solution, Len)   -  person lurker    schedule 07.04.2016


คำตอบ (1)


ดังนั้นก่อนอื่น คุณต้องสร้างเมทริกซ์ของคุณ ซึ่งจะกลายเป็นตารางปริศนาคาคุโระของคุณ นั่นเป็นขั้นตอนแรกอย่างแน่นอน - ขออภัยหากคุณได้ทำไปแล้ว

จากนั้น คุณต้องการสร้างกฎสองสามข้อสำหรับข้อจำกัดข้าม:

acrossConstraints(Matrix) :- getAcross(List), applyAcross(Matrix,List).
%this is the overall thing to call, containing two predicates you need to make
getAcross :- findall([R,C,L,S],across(R,C,L,S),List).
%creates a list of the across facts
applyAcross(Matrix,[[R,C,L,S]|T]) :- acrossConstraints(R,C,L,S,M), applyAcross(Matrix,T). 
%call another rule and recurse over the list.

acrossConstraints นั้นค่อนข้างยุ่งยาก - ที่นี่คุณต้องการคว้าสี่เหลี่ยมที่คุณต้องการแล้วสร้างรายการโดยเริ่มจากจุดนั้น คำแนะนำ: ใช้ผนวกและคำใบ้

ขอให้โชคดี!

person eponini    schedule 07.04.2016