簡體   English   中英

Prolog中兩個元組列表的交集

[英]Intersection of Two Lists of Tuples in Prolog

我正在嘗試使用intersection()函數在Prolog中找到兩個列表的intersection() 不幸的是,我的代碼給出了不良的結果。

這是我所擁有的:

RESULTA = [ ('10:00 am - 11:15 am', 'TR'), ('6:00 pm - 8:50 pm', 'T'), ('6:00 pm - 8:50 pm', 'R'), ('6:00 pm - 8:50 pm', 'M')].

RESULTB = [ ('6:00 pm - 8:50 pm', 'R'), ('3:00 pm - 3:50 pm', 'TR')].

intersection(RESULTA, RESULTB, AB).

所需的輸出是('6:00 pm - 8:50 pm', 'R')但是,代碼返回RESULTA = AB, AB = [].

有誰知道如何解決此問題?

編輯

RESULTA和RESULTB實際上是從bagof()操作生成的。 我的實際代碼是:

1 ?- bagof((TIME, DAYS), COURSE^teaches_at('Dr. J. Leidig', COURSE, TIME, DAYS), RESULTA).
RESULTA = [ ('10:00 am - 11:15 am', 'TR'), ('6:00 pm - 8:50 pm', 'T'), ('6:00 pm - 8:50 pm', 'R'), ('6:00 pm - 8:50 pm', 'M')].

2 ?- bagof((TIME, DAYS), COURSE^teaches_at('Dr. El-Said', COURSE, TIME, DAYS), RESULTB).
RESULTB = [ ('6:00 pm - 8:50 pm', 'R'), ('3:00 pm - 3:50 pm', 'TR')

對困惑感到抱歉。

您問題中的代碼實際上是對Prolog的查詢。

有3個不同的查詢:每個查詢以一個句點結尾。 這三個查詢都是完全獨立的,即使它們共享相同名稱的變量也是如此。

要執行您想要的操作,只需將句點更改為逗號即可:

RESULTA = [ ('10:00 am - 11:15 am', 'TR'), ('6:00 pm - 8:50 pm', 'T'), ('6:00 pm - 8:50 pm', 'R'), ('6:00 pm - 8:50 pm', 'M')],
RESULTB = [ ('6:00 pm - 8:50 pm', 'R'), ('3:00 pm - 3:50 pm', 'TR')],
intersection(RESULTA, RESULTB, AB).

問題更新后更新:

bagof((TIME, DAYS), COURSE^teaches_at('Dr. J. Leidig', COURSE, TIME, DAYS), RESULTA),
bagof((TIME, DAYS), COURSE^teaches_at('Dr. El-Said', COURSE, TIME, DAYS), RESULTB),
intersection(RESULTA, RESULTB, AB).

您必須在規則中使用該變量,例如

test(AB) :-
    RESULTA = [ ('10:00 am - 11:15 am', 'TR'), ('6:00 pm - 8:50 pm', 'T'), ('6:00 pm - 8:50 pm', 'R'), ('6:00 pm - 8:50 pm', 'M')],
    RESULTB = [ ('6:00 pm - 8:50 pm', 'R'), ('3:00 pm - 3:50 pm', 'TR')],
    intersection(RESULTA, RESULTB, AB).

然后查閱文件。 你會得到

?- test(AB).
AB = [ ('6:00 pm - 8:50 pm', 'R')].

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM