2
temperature(thessaloniki,january,24,1).
temperature(thessaloniki,january,25,-2).
temperature(katerini,january,24,3).
temperature(loutsa,feb,25,1).

temp([],[],[]).
temp([H|T],L2,L3) :-
   temp(T,L4,L5),
   temperature(H,january,_,Te),
   Te>0,
   append([H],L4,L2),
   L3=L5.
temp([H|T],L2,L3) :-
   temp(T,L4,L5),
   temperature(H,january,25,Te),
   Te<0,
   append([H],L5,L3),
   L2=L4.
temp([H|T],L2,L3) :-
   temp(T,L4,L5),
   L2=L4,
   L3=L5.

気温と日付のある町があります。そして、それらを正しいリストに追加する必要があります。ルールは正しいと思いますが、TkEclipse で実行すると次のようになります。

?- temp([thessaloniki, thessaloniki, katerini, loutsa], L2, L3).
L2 = [thessaloniki, thessaloniki, katerini]
L3 = []

そして、私がプログラムのトレーサーで見たように、最初のtemperature(thessaloniki,january,24,1).2 回だけを取り、2 回目は取りません temperature(thessaloniki,january,25,-2).

4

2 に答える 2

0

目標を明確に述べていないため、コード スニペットから推測するしかありません。「フィルター」値が欠落していると思いますMon,Day。宣言された事実から適切な選択を強制するために追加します。

利用可能な制御述語の使用を検討し、append/3 を避ける:

temperature(thessaloniki,january,24,1).
temperature(thessaloniki,january,25,-2).
temperature(katerini,january,24,3).
temperature(loutsa,feb,25,1).

temp([H|T], Mon, Day, L2, L3) :-
   (   temperature(H, Mon, Day, Te)
   ->  (   Te > 0
       ->  L2 = [H|L4], L3 = L5
       ;   Te < 0
       ->  L2 = L4, L3 = [H|L5]
       ;   L2 = L4, L3 = L5
       )
   ;   L2 = L4, L3 = L5
   ),
   temp(T, Mon, Day, L4, L5).

temp([], _, _, [], []).

収量

?- temp([katerini, loutsa, thessaloniki],january,24,A,B).
A = [katerini, thessaloniki],
B = [].

?- temp([katerini, loutsa, thessaloniki],january,25,A,B).
A = [],
B = [thessaloniki].

append/3 を回避する方法に注意してください:consing再帰呼び出しによって「返された」適切なリストにリストを作成します。Prolog の統合のおかげで、呼び出しが「まだ来ていない」場合でも実行できます。

結果のコードは末尾再帰であり、効率が向上したと思います。

HTH

edit現在は同等のプログラムですが、(IMHO) より優れています

temp([H|T], Mon, Day, L2, L3) :-
   (   temperature(H, Mon, Day, Te)
   ->  (   Te > 0
       ->  L2/L3 = [H|L4]/L5
       ;   Te < 0
       ->  L2/L3 = L4/[H|L5]
       ;   L2/L3 = L4/L5
       )
   ;   L2/L3 = L4/L5
   ),
   temp(T, Mon, Day, L4, L5).

コメントの後に編集...

temp([H|T], L2, L3) :-
   (   temperature(H, january, Day, Te)
   ->  (   Te > 0
       ->  L2/L3 = [H|L4]/L5
       ;   Te < 0, Day = 25
       ->  L2/L3 = L4/[H|L5]
       ;   L2/L3 = L4/L5
       )
   ;   L2/L3 = L4/L5
   ),
   temp(T, L4, L5).
temp([], [], []).

収量

A = [katerini, thessaloniki],
B = [].
于 2013-03-22T09:07:37.433 に答える