为什么我在 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).
我必须显示列表中的所有元素,如示例所示。
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).