首页 文章

使用Prolog规则中的事实列表

提问于
浏览
1

我目前正在编写一个铁路线计划但是使用来自事实的列表有点麻烦 . 我是Prolog的新手,到目前为止已经写了以下事实和规则:

location(euston, [northernLine]).
location(warrenStreet, [victoriaLine, northernLine]).
location(warwickAvenue, [bakerlooLine]).
location(paddington, [bakerlooLine]).

hasCommonLine(Location1, Location2, Line) :-
    location(Location1, Line),
    location(Location2, Line).

我们的想法是让规则返回两个位置共有的行的名称 . 如果我尝试 hasCommonLine(warwickAvenue,paddington,Line). ,这是有效的,但如果我尝试 hasCommonLine(euston,warrenStreet,Line). 它会返回false .

我怀疑这是因为规则只检查列表的第一个元素,因此只比较 [northernLine][victoriaLine] 而不是检查列表中的每个元素 . 任何指导,以实现这一点将非常感谢!

3 回答

  • 2

    我怀疑这是因为规则只检查列表的第一个元素 .

    不,程序检查 two lists are identical . 因此,只有当两个 Line 完全等效(相同的元素,相同的顺序)时,它们才匹配 .

    使用列表指定行列表是相当不道德的 . 通常他们将其表示为以下事实列表:

    location_new(euston,northernLine).
    location_new(warrenStreet,victoriaLine).
    location_new(warrenStreet,northernLine).
    location_new(warwickAvenue,bakerlooLine).
    location_new(paddington,bakerlooLine).
    

    所以这里 warrenStreet 出现两次:一次是 victoriaLine ,一次是 northernLine . 然后你可以简单地写:

    hasCommonLine(Location1, Location2, Line) :-
        location_new(Location1, Line),
        location_new(Location2, Line).
    

    然而,由于情况并非如此,您可以编写一个帮助谓词 location_helper/2

    location_helper(A,B) :-
        location(A,L),
        member(B,L).
    

    然后定义:

    hasCommonLine(Location1, Location2, Line) :-
        location_helper(Location1, Line),
        location_helper(Location2, Line).
    
  • 2

    您可以检查 Line 是否是两个列表的成员:

    hasCommonLine(Location1, Location2, Line) :-
         location(Location1, Lines1),
         location(Location2, Lines2),
         member(Line, Lines1),
         member(Line, Lines2).
    

    然后,如果您需要找到两个位置之间共同的所有线路,您只需拨打电话即可

    ?- findall(X, hasCommonLine(euston, warrenStreet, X), Y).
     Y = [northernLine].
    
  • 1

    你的规则需要改进 .
    现在,它检查两个位置是否具有完全相同的行列表 .

    您应该做的是制定检查两者之间是否存在重叠的规则 . 您可以使用一个谓词来检查两个列表的交集 .

    它看起来像这样:

    hasCommonLine(Location1,Location2, CommonLines):-
        location(Location1,Line1),
        location(Location2,Line2),
        intersection(Line1,Line2,CommonLines).
    

相关问题