2016-10-25 183 views
3

我需要为Prolog创建笛卡尔积计算器。它应该是这样的:Prolog - 笛卡尔积计算器

输入:product([1,2,3], [a,b], X).

输出:X = [[1,a],[2,a],[3,a],[1,b],[2,b],[3,b]].

我知道有在互联网上的例子,但我想写自己的东西。

这是我的代码,我认为它非常接近,但由于某些原因,它不能正常工作。任何想法,家伙?

% call new with 4 parameters (so we can keep List1 in memory) 
product(L1,L2,L3):- product(L1,L2,L3,L1). 

% stop when both List1 and List2 are empty 
product([], [], [], []). 

% first list is empty, recreate it and work it again with the next element of second list (and shorten memory) 
product([], [_|T2], List3, [H4|T4]):- 
    product([H4|T4], T2, List3, T4). 

%go through first list and always first element of second list to our answer 
product([H1|T1], [H2|T2], [[H1,H2]|T3], List4):- 
    product(T1, [H2|T2], T3, List4). 

回答

2

作为由编码器(1)表示,则应将终端从子句

改变
product([], [], [], []). 

product(_, [], [], _). 

但ins't足够。

您shuold从

product([], [_|T2], List3, [H4|T4]):- 
    product([H4|T4], T2, List3, T4). 

澈第三条改为

product([], [_|T2], List3, L4):- 
    product(L4, T2, List3, L4). 

我的意思是:在一个错误消耗保存清单1.

有了您的版本,从

product([1,2,3,4,5], [a,b,c,d], X), 

你只有

[[1,a],[2,a],[3,a],[4,a],[5,a],[1,b],[2,b],[3,b],[4,b],[5,b],[2,c],[3,c],[4,c],[5,c],[3,d],[4,d],[5,d]] 

那就是:你松[1,c][1,d][2,d]

+0

谢谢! (+1)指出第二个错误! – coder

+0

是的,这有效,我明白为什么。谢谢你们俩。 – PadaKatel

3

您应该更改条款:

product([], [], [], []). 

到:

product(_, [], [], _). 

这是因为当L2变成空它要求产品(L1,[],L3,L4),其中L1和L4不是空的。您的碱情况下必须是当L2变空(然后L3变空作为输出列表)和其他列表可以具有元素:

?- product([1,2,3], [a,b], X). 
X = [[1, a], [2, a], [3, a], [1, b], [2, b], [3, b]] ; 
false.