0

Learn Prolog Now 演習 (このページの最後の演習) を解決できません。簡単に言うと、「byCar (place1, place2)」、「byTrain (place1, place2)」、「byAirplane (place1, place2)」という形式の事実がたくさんあり、travel/3 述語を書かなければなりません。 (私はこれをチケットと呼んでいます) は、場所 1 から場所 2 に移動するためにどのチケットを購入すればよいかを示します。

たとえば、クエリ

tickets(valmont, losAngeles, X)

次のような回答を返す必要があります。

X = goByCar(valmont, saarbruecken,
   goByTrain(saarbruecken, frankfurt,
   goByAirplane(frankfurt, bangkok,
   goByAirplane(bangkok, auckland,
   goByAirplane(auckland, losAngeles)))))

私の現在の解決策は次のとおりです。

ticketsDir(A, B, goByCar(A, B)) :- byCar(A, B).
ticketsDir(A, B, goByTrain(A, B)) :- byTrain(A, B).
ticketsDir(A, B, goByAirplane(A, B)) :- byAirplane(A, B).

swapGo(goByCar(A, B)) :- goByCar(B, A).
swapGo(goByTrain(A, B)) :- goByTrain(B, A).
swapGo(goByAirplane(A, B)) :- goByAirplane(B, A).

mergeGo(goByCar(A, B), Go2) :- goByCar(A, B, Go2).
mergeGo(goByTrain(A, B), Go2) :- goByTrain(A, B, Go2).
mergeGo(goByAirplane(A, B), Go2) :- goByAirplane(A, B, Go2).

tickets(A, B, Go) :- ticketsDir(A, B, Go).
tickets(A, B, swapGo(Go)) :- ticketsDir(B, A, Go).
tickets(A, B, mergeGo(Go1, Go2)) :- ticketsDir(A, Z, Go1), tickets(Z, B, Go2).
tickets(A, B, mergeGo(Go1, Go2)) :- ticketsDir(Z, A, Go1), tickets(Z, B, Go2).

ただし、そのクエリは次の結果を返します。

X = mergeGo(goByCar(valmont, saarbruecken),
   mergeGo(goByTrain(saarbruecken, frankfurt),
   mergeGo(goByAirplane(frankfurt, bangkok),
   mergeGo(goByAirplane(bangkok, auckland),
   swapGo(goByAirplane(losAngeles, auckland))))))"

奇妙なことに、クエリは

swapGo(goByCar(A, B))

戻り値:

Error: swapGo/1: Undefined procedure: goByCar/2

そしてクエリ

mergeGo(goByCar(A, B), go2)

戻り値 :

Error: mergeGo/2: Undefined procedure: goByCar/3

「swapGo」と「mergeGo」、または「チケット」を間違って定義しているようです。それを修正するための提案はありますか?ありがとう!

4

0 に答える 0