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

Why do i get unexpected answer in Prolog. List, multiply, recursion

我必须显示列表中的所有元素,如示例所示。 Element: el, List: L. [L1el1, L2el1], [L1el2, L2el1], [L1el3, L2el1]... 我正在使用 multiply/3 predecate to 运行 程序和 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的末尾?如何解决?

问题出在 multiply/4 递归退出条件。

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