List 为什么我会在序言中得到意想不到的答案。列表、乘法、递归

List 为什么我会在序言中得到意想不到的答案。列表、乘法、递归,list,recursion,prolog,multiplication,List,Recursion,Prolog,Multiplication,我必须显示列表中的所有元素,如示例所示。 元素:el,列表:L.[L1el1,L2el1],[L1el2,L2el1],[L1el3,L2el1]… 我使用multiply/3predecate运行程序,使用multiply/4进行递归。当'Tmp'为空时,它从'L1'恢复(仅当L2不为空时。否则,终止递归) 摘要示例: for element l in List1 { for element k in List2 { print([k, l]); } } my

我必须显示列表中的所有元素,如示例所示。
元素:el,列表:L.[L1el1,L2el1],[L1el2,L2el1],[L1el3,L2el1]…
我使用
multiply/3
predecate运行程序,使用
multiply/4
进行递归。当'Tmp'为空时,它从'L1'恢复(仅当L2不为空时。否则,终止递归)

摘要示例:

for element l in List1 {
    for element k in List2 {
        print([k, l]);
    }
}
my_code.pl

multiply(L1, L2, X):-
    multiply(L1, L2, L1, X).

multiply(X, [], _, X).

multiply([], [_|T], Tmp, X):-
    multiply(Tmp, T, Tmp, X),!.

multiply([H|T], [H1|T1], Tmp, [[H,H1]|X]):-
    multiply(T, [H1|T1], Tmp, X).
预期:

?- multiply([1,2,3], [a,b], X).
X = [[1, a], [2, a], [3, a], [1, b], [2, b], [3, b]].
我得到了什么:

?- multiply([1,2,3], [a,b], X).
X = [[1, a], [2, a], [3, a], [1, b], [2, b], [3, b], 1, 2, 3].
如何通过稍微修改此代码获得预期结果不使用内置谓词


为什么L1出现在X的末尾?如何修复它?

问题在于退出递归条件的
乘法/4

    multiply(X, [_|X], _, X).

问题出现在您的第2个子句中:
乘法(X,[],\ux)。
。这个子句将从一开始就成功地使用
X=[1,2,3]
,因此
[1,2,3]
将成为生成的任何结果的尾部。仔细想想你的谓词在语义上意味着什么,确保你的规则是有意义的。谢谢。已经解决了。