4

次の問題を解決する深さ優先検索と幅優先検索を実装するプロローグプログラムを実装しようとしています

Rowena は、3 オンス、5 オンス、および 8 オンスの異なるサイズのマークのないグラスを 3 つ持っています。一番大きなグラスがいっぱいです。大きい 2 つのグラスのそれぞれに 4 オンスの液体を入れるには、ロウェナはどうすればよいでしょうか?

私は(大、中、小)を持っています

したがって、初期状態は (8,0,0) で、目標状態は (4,4,0) です。

これで、状態空間に 6 つの利用可能な移動があることがわかりました。

(1,2) ラージをミディアムまたはスモールに注ぎます (3,4) ミディアムをラージまたはスモールに注ぎます (5,6) スモールをミディアムまたはラージに注ぎます

今、私は最初のルールについて助けが必要であり、残りは私が理解する. したがって、ラージ > 0 でミディアムが満杯でない場合にのみラージをミディアムに注ぐことができ、新しいラージは古いラージからミディアムに注がれた量を差し引いたものになり、新しいミディアムは古いミディアムにその量を加えたものになります。それが注ぎ込まれ、もちろん小さいことは決して変わりません。

これが私が試みたものです。

%move rule #1: Pour Large into Medium (L--> M) 
%move(oldstate,newstate)

move([L, M, S], [NewLarge,NewMedium,S]) :-
L > 0, %We can't move large into medium if Large has nothing
M < 5, %We can't pour into the medium if medium is full
Diff = 5 - M, 
NewLarge is L - Diff, %calculate the new Large
NewMedium is M + (L - NewLarge). %calculate the new Medium 

これは、利用可能な最初の動き (大から中) の正しい実装ですか? そこで正しいロジックを取得しましたか?

4

1 に答える 1

2

代わりにロジックが必要だと思います

move([L, M, S], [NewLarge, NewMedium, S]) :-
  Diff is min(5 - M, L),
  Diff > 0,
  NewLarge is L - Diff, %calculate the new Large
  NewMedium is M + Diff. %calculate the new Medium 
于 2015-11-08T21:21:30.293 に答える