我是Prolog的新手,我對理解遞歸有點麻煩。我正在嘗試編寫一個關係式,它可以在不使用SWI的內置交叉點的情況下查找兩個排序列表的交集。我使用trace來查看發生了什麼,它的行爲與我期望的一樣,直到我希望它終止並返回包含交集的新列表。這讓我認爲我的基本情況是錯誤的。我用幾種不同的方式來構建基本案例,但它並沒有取得豐碩成果。我一直使用列表[1,2,3,4和[2,4,6]作爲測試用例,它們具有以下關係(頂部的基本情況只是我作爲佔位符投入的一個...它根本不起作用):SWI-Prolog中的交集
intersectS([], [], []).
intersectS([A | B], [C | D], Z) :- A < C, intersectS(B, [C | D], Z).
intersectS([A | B], [C | D], Z) :- A > C, intersectS([A | B], D, Z).
intersectS([A | B], [C | D], Z) :- A = C, append(Z, [A], Y), intersectS(B, D, Y).
任何幫助表示讚賞。我已經看到了切割(!)操作符與成員/非成員一起使用的示例,但我應該利用列表已排序的事實,所以我認爲我會嘗試這種方法。提前致謝。
啊,我嘗試添加像相交的事實(d,[],Z)和交叉([], D,Z),但我完全忘記了下劃線選項。我現在看到我的邏輯錯誤,非常感謝你! – Jsh
作爲一個側面說明,爲什麼這個關係仍然返回false? Z的價值的正確性不可證明嗎? – Jsh
@Jsh它返回'false',因爲在用一個解決方案提示並且用';'請求更多內容之後,這意味着沒有更多的解決方案。所以'錯誤的迴應並不適用於找到的解決方案,而是因爲沒有其他解決方案。 – lurker