我正在为伦敦管编写代码 . 我已经声明了显示电台名称以及它所在的线路的事实 . 例如
station(aldgate,metropolitan). station(brixton,victoria). station(baker,metropolitan).
我正在尝试制定一个规则来检查两个站是否在同一条线上,以及哪条线 . 例如, aldgate 和 baker 位于同一行 metropolitan .
aldgate
baker
metropolitan
有任何想法吗?
我正在尝试制定一条规则,检查两个工作站是否在同一条线上,以及哪条线 .
一个例子可以是以下规则
sameLine(Stat1, Stat2, Line) :- station(Stat1, Line), station(Stat2, Line), Stat1 \= Stat2.
这很灵活 .
它可以检查几个站是在同一行(调用 sameLine(aldgate, baker, metropolitan) 返回true,调用 sameLine(aldgate, baker, Line) 返回true并统一 Line 与 metropolitan )但可以找到一对线的站点(调用 sameLine(Stat1, Stat2, metropolitan) 返回true两次,用 aldgate 统一 Stat1 和 Stat2 与 baker (第一次),反之亦然(第二次)) .
sameLine(aldgate, baker, metropolitan)
sameLine(aldgate, baker, Line)
Line
sameLine(Stat1, Stat2, metropolitan)
Stat1
Stat2
遵守约束
Stat1 \= Stat2.
这是两个站不同的强加 .
如果你希望 sameLine(aldgate, aldgate, Line) 返回true与 metropolitan 统一 Line ,你可以删除它 .
sameLine(aldgate, aldgate, Line)
如果您,否则,想要避免双重结果( aldgate / baker 和 baker / aldgate ,例如,调用 sameLine(Stat1, Stat2, metropolitan) ),您可以强制 Stat1 不仅与 Stat2 不同,而且"before" Stat2 ,取而代之
Stat1 \= Stat2
同
Stat1 @< Stat2
但是,通过这种方式,您从 sameLine(aldgate, baker, Line) 获得true,但从 sameLine(baker, aldgate, Line) 获得false(因为 baker 不是"before" aldgate ) .
sameLine(baker, aldgate, Line)
1 回答
一个例子可以是以下规则
这很灵活 .
它可以检查几个站是在同一行(调用
sameLine(aldgate, baker, metropolitan)
返回true,调用sameLine(aldgate, baker, Line)
返回true并统一Line
与metropolitan
)但可以找到一对线的站点(调用sameLine(Stat1, Stat2, metropolitan)
返回true两次,用aldgate
统一Stat1
和Stat2
与baker
(第一次),反之亦然(第二次)) .遵守约束
这是两个站不同的强加 .
如果你希望
sameLine(aldgate, aldgate, Line)
返回true与metropolitan
统一Line
,你可以删除它 .如果您,否则,想要避免双重结果(
aldgate
/baker
和baker
/aldgate
,例如,调用sameLine(Stat1, Stat2, metropolitan)
),您可以强制Stat1
不仅与Stat2
不同,而且"before"Stat2
,取而代之同
但是,通过这种方式,您从
sameLine(aldgate, baker, Line)
获得true,但从sameLine(baker, aldgate, Line)
获得false(因为baker
不是"before"aldgate
) .