我正在实践一些内置的prolog函数。但是,我在交集和差异中遇到麻烦,因为在我的基本递归情况下,我需要将我的返回值设置为空集。我不知道怎么做这个并环顾四周我还没找到答案。
当我运行代码时,我得到以下内容:
1 ?- intersectionx([1,2,3],[3,4,5],Z).
Z = [3|_G3196] .
2 ?- differencex([1,2,3],[3,4,5],Z).
Z = [1, 2|_G3181]
这是第16行和第22行的相关谓词的逐行实际。
/* memberx */
/* test is X a member of set Y, X subset Y */
memberx(X1,[X1|_]).
memberx(X2,[_|T2]) :- memberx(X2, T2).
/* unionx */
/* union sets X and Y and return the resulting set as Z. */
unionx([], Y3, Y3). /* base case */
unionx([XH4|XT4], Y4, Z4) :- memberx(XH4, Y4), unionx(XT4, Y4, Z4).
unionx([XH5|XT5], Y5, [XH5|Z5]) :- not(memberx(XH5, Y5)), unionx(XT5, Y5, Z5).
/* intersectionx ???*/
/* Find the intersection of sets X and Y and return the result as set */
/* Z. X intersection Y = Z */
intersectionx([], Y6, Z6). /*In the base case here how do I set Z6 to []?*/
intersectionx([XH7|XT7], Y7, Z7) :- not(memberx(XH7, Y7)), intersectionx(XT7, Y7, Z7).
intersectionx([XH8|XT8], Y8, [XH8|Z8]) :- memberx(XH8, Y8), intersectionx(XT8, Y8, Z8).
/* differencex */
/* Find the difference of set X and Y and return the result as set Z. */
differencex([], Y9, Z9).
differencex([XH10|XT10], Y10, [XH10|Z10]) :- not(memberx(XH10, Y10)), differencex(XT10, Y10, Z10).
differencex([XH10|XT10], Y10, Z10) :- memberx(XH10, Y10), differencex(XT10, Y10, Z10).
我知道这可能是一件相对简单的事情,但一段时间以来一直令我感到困惑。
答案 0 :(得分:2)
这很简单:
intersectionx([], _, []).
我发现你的变量编号有点奇怪。你有没有理由这样做?您可以毫不费力地在不同的谓词中使用相同的变量名称。