0

持っている-myMultiply/3

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

左側のリストの各要素を2番目の引数の修道女に掛けて返すもの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. 

上記の例の代わりに。

私がここで間違ったことは何ですか?

4

1 に答える 1

1

コードには 2 つの問題があります。

ここでは、基本的な修正を行い、無駄なカットについてコメントしました。

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]].

カットが役に立たない理由がわかりますか?

于 2013-01-20T13:09:52.113 に答える