2016-12-15 5 views
0

非常に、ここではPrologが非常に新しいです。同じ長さの2つのリストの各位置に大きな項目を含むリストを返すプロローグルールのセットを記述しますか?

larger([],[],[]). 
larger([H|T],[E|A],X):- H > E, larger([T],[A],[H|X]). 
larger([H|T],[E|A],X):- H < E, larger([T],[A],[E|X]). 

任意の助けを:My機能は、これは私が持っているものですが、私が必要なものを私になっていません(X = [6, 12, 11].を返すlarger([3, 12, 5], [6, 3, 11], X)など)新しいリストに大きな数を取ることによって、同じ長さの2つのリストを比較する必要があります非常に感謝しています。

答えて

1

あなたは遠くありません。

私は間違っていないよ場合は、あなたのコード内の3つのエラーがある

larger([], [], []). 

larger([H | T], [E | A], [H | X]) :- 
    H > E, 
    larger(T, A, X). 

larger([H | T], [E | A], [E | X]) :- 
    H =< E, 
    larger(T, A, X). 

で試してみてください。

(1)あなたがいない[H|T]

% ------- H added here ---v 
larger([H | T], [E | A], [H | X]) :- 
    H > E, 
    larger(T, A, X). 
% not here ----^ 

(2)TA、尾再帰呼び出しで、larger/3の第三引数に大きな頭値(HまたはE)を変換する必要がありますそして、[E|A]は、リストされているので、あなたはTAなど、ない[T][A]

larger([H | T], [E | A], [H | X]) :- 
    H > E, 
    larger(T, A, X). 
% not larger([T], [A], X) 
として再帰的に彼らを渡す必要があります

(3)H > EH < Eの場合は、HEに等しいときにコードが失敗します。 1つの解決策は、H > EH =< Eです。セコンケースカバーHEに等しい。

2

もう1つの答えはOKですが、これはやや異なるアプローチです。

2つの句は十分なはずです:

larger([], [], []). 
larger([X|Xs], [Y|Ys], [Z|Zs]) :- 
    /* Z is the larger number from (X, Y) */ 
    larger(Xs, Ys, Zs). 

あなたはコメントで一部の操作を行いどのようにあなたの正確な問題声明と、おそらく実装に依存します。

larger([], [], []). 
larger([X|Xs], [Y|Ys], [Z|Zs]) :- 
    Z is max(X, Y), 
    larger(Xs, Ys, Zs). 

これは、それは残すことはありませんので、3句を持つソリューションよりも間違いなくよりよいです:少なくともSWI-PrologのとGNU-Prologの両方を使用すると、上記の中で次のように使用することができます演算機能max()を持っています不要な選択肢の後ろに他のソリューションと同様に、2つのリストに数字がある限り、正常に動作します。

これは、このような、例えば、maplistを使用するのと同じであろう。

larger(Xs, Ys, Zs) :- 
    maplist(max_number, Xs, Ys, Zs). 

max_number(X, Y, Z) :- Z is max(X, Y). 
関連する問題