Prolog - 列表清单

时间:2013-01-20 12:49:08

标签: prolog

有 - myMultiply/3

myMultiply([],X,[]) :- !.
myMultiply([H|T],X,Result) :-
    myMultiply(T,X,NewRest),
    Elem is H*X,
    Result = [Elem|NewRest].

将左边的每个元素排在第2个arg的nun并返回Result

例如 -

myMultiply([1,4,5],4,R).
R = [4,16,20].

tlm/3

tlm(List1,[],_) :- !.
tlm(List1,[H2,Rest2],Result):-
    myMultiply(List1,H2, Elem),
    tlm(List1,Rest2,NewResult),
    Result = [Elem|NewResult].

我尝试将myMultiply/3设置在右侧列表的每个元素的左侧列表中,然后重新调整Result

例如 -

?- tlm([3,4,2],[4,7,8],R).
R = [[12,16,8],[21,28,14],[24,32,16]].

一般来说,想法是获取Elem列表并将其连接到NewResult

我的问题是tlm/3会返回false -

 ?- tlm([3,4,2],[4,7,8],R).
false. 

而不是上面的例子。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您的代码有两个问题。

在这里,我做了一个基本的修正,并评论了无用的削减。

myMultiply([],X,[]) :- !. % the cut is useless here
myMultiply([H|T],X,Result) :-
    myMultiply(T,X,NewRest),
    Elem is H*X,
    Result = [Elem|NewRest].

tlm(List1,[],[]) :- !. % the cut is useless here
tlm(List1,[H2|Rest2],Result):-
    myMultiply(List1,H2, Elem),
    tlm(List1,Rest2,NewResult),
    Result = [Elem|NewResult].

,结果是......

?- tlm([3,4,2],[4,7,8],R).
R = [[12, 16, 8], [21, 28, 14], [24, 32, 16]].

你能否发现切割无用的原因?