仅显示语句中的差异

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅显示语句中的差异相关的知识,希望对你有一定的参考价值。

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").

说我有这些陈述。

有一个小故障,约翰和简在同一航班上预订了同一个座位。 (前两个陈述)。如何编写返回双重预留席位预订代码的程序? (在这种情况下为“8V32EU”和“8V32EU2”)。我需要计算所有双重预订的预订代码

我到目前为止的尝试:

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

但是这只有在你给它有问题的座位时才有效:

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

没有它有办法吗?只有double_reservations(BookingCode, _, _, _).

答案

我认为您应该将有问题的预订代码的识别分开,然后从预留/ 7表中恢复所需的任何细节:

double_reservations(BookingCode1, BookingCode2) :-
   reservation(BookingCode1, _Fname1, _Lname1, SeatNo, OAir, DAir, Airline),
   reservation(BookingCode2, _Fname2, _Lname2, SeatNo, OAir, DAir, Airline),
   BookingCode1 = BookingCode2.
另一答案

你可以使用findall/3setof/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).

查询:

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

我使用findall/3sort/2去除重复(read this),而不是setof/3,因为如果目标没有解决方案,findall/3将返回一个空列表,而setof/3(和bagof/3)将在这种情况下失败(link)。如果您不想删除重复项,可以使用msort/2

以上是关于仅显示语句中的差异的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell中的Compare-Object无法仅显示差异

Excel 公式或规则或 vba 比较 2 个单元格并仅突出显示差异

DialogFragment:创建片段时仅显示一次动画

仅在父片段中的操作栏中显示搜索视图

为啥尽管源代码没有变化,但从一个系统到另一个系统的片段数量却有很大差异?

使用 imagemagick compare 仅显示差异