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]
将成为生成的任何结果的尾部。仔细想想你的谓词在语义上意味着什么,确保你的规则是有意义的。谢谢。已经解决了。