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

时间:2015-10-15 12:56:43

标签: list recursion prolog multiplying

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

1 个答案:

答案 0 :(得分:-1)

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

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