2017-12-26 26 views
0
reservation("8V32EU", "John", "Doe", "27B", "YYZ", "CPH", "SAS"). 
reservation("8V32EU2", "Jane", "Doe", "27B", "YYZ", "CPH", "SAS"). 
reservation("94ISCU", "John", "Doe", "2C", "CPH", "YYZ", "SAS"). 
reservation("FDSDD3", "John", "Doe", "12D", "YYZ", "ROU", "SAS"). 

私はこれらの記述があると言います。ステートメントの相違点だけを表示

同じ飛行でジョンとジェーンが同じ座席を予約しました。 (最初の2つのステートメント)。 ダブル予約された座席の予約コードを返す手続きを書くにはどうすればよいですか? (この場合「8V32EU」および「8V32EU2」)。

double_reservations(BookingCode, "27B", _, _). 

あります:あなたはそれを与える場合は、当該座席がしかし、これだけ作品

double_reservations(BookingCode, SeatNo, Fname, Lname) :- 
    reservation(BookingCode, Fname, Lname, SeatNo, _, _, _). 

:私はすべて、二重の予約の予約コードに、これまで基本的に

私の試みを計算する必要がありますそれなしの方法?のみdouble_reservations(BookingCode, _, _, _).

+0

ので、あなたが原点空港、先の空港と航空会社であることを確認する意味します同じですか? – crystyxn

+0

提案はありますか?私はプロローグでこれを行う方法を知りません – crystyxn

+0

あなたはたぶんコメントに手続きを書くことができますか?私はこれについてどうやって行くのか分かりません。ありがとう。 – crystyxn

答えて

1

私はあなたが問題の予約コードの識別を分離した後、予約/ 7テーブルから必要なものは何でも細部に回復すべきだと思う:

double_reservations(BookingCode1, BookingCode2) :- 
    reservation(BookingCode1, _Fname1, _Lname1, SeatNo, OAir, DAir, Airline), 
    reservation(BookingCode2, _Fname2, _Lname2, SeatNo, OAir, DAir, Airline), 
    BookingCode1 \= BookingCode2. 
+0

これは、A、BおよびB、Aの両方を返します。最後の行で '@<'を使用すると、1つしか得られません。 –

+0

@TomasBy:そうですね。私は最も基本的なリレーショナルスキーマの説明にもっと興味を持っていました。 – CapelliC

+0

これはうまくいった!ありがとうございました。 '' '' @ '' ''を使うのはどういう意味ですか? – crystyxn

1

findall/3またはsetof/3を使用してこの問題を解決できます。ここでfindall/3を使用したソリューション:

getDouble([]). 
getDouble([HS|TS]):- 
    findall(C,reservation(C,_,_,HS,_,_,_),LC), 
    length(LC,N), 
    ( N > 1 -> 
     writeln(LC) 
    ; true), 
    getDouble(TS). 

solve:- 
    findall(S,reservation(_,_,_,S,_,_,_),LS), 
    sort(LS,L), 
    getDouble(L). 

問合せ:私は目標は解がない場合findall/3は空のリストを返しますので、(read this)を重複を削除、代わりのsetof/3するfindall/3sort/2を使用

?- solve. 
[8V32EU, 8V32EU2] 
true 

このような状況ではsetof/3(およびbagof/3)は失敗します(link)。重複を削除しない場合は、msort/2を使用できます。

+0

それは素晴らしい作品をありがとう! – crystyxn