规则头和规则体的混乱?

时间:2015-01-06 05:04:58

标签: prolog logic

我正在尝试从给定的知识库中编写一个关于本地库的规则,这将允许我查看两位作者是否一起编写了文本。

这是正在使用的知识库。

localLib(‘AHorowitz’, ‘Stolen Gods’, 2011, ‘Scorpia Rising’, 448, 4).
localLib(‘AHorowitz’, ‘Night Visitors’, 2000, ‘Stormbreaker’, 240, 2).
localLib(‘AHorowitz’, ‘Matador’, 2003, ‘Eagle Strike’, 340, 6).
localLib(‘AJohnston’, ‘Night Visitors’, 2000, ‘Stormbreaker’, 240, 2).
localLib(‘AJohnston’, ‘Matador’, 2003, ‘Eagle Strike’, 340, 6).
localLib(‘RMuchamore’, ‘Basic Training’, 2007, ‘The Recruit, 342, 3).
localLib(‘MHaddon’, ‘11.’, 2004, ‘The Curious Incident Of The Dog In The Night Time’, 226, 5).

KB的关键如下:

localLib(w, e, y, t, n, c) where
w = writer’s name
e = excerpt in text
y = year of text
t = title of text
n = no. of pages in text 
c = no. of acknowledgements

这是我为规则编写的代码:

searchlocalLib(W,E,_,_,_,_):- localLib((W1,W2),E,_,_,_,_). 

但是我感到非常困惑,因为这看起来不正确,因为我觉得因为我没有在规则头中描述W1和W2,因此查询将无效,请问我可以收到一些指导吗?

另外说如果两位作家在指定年份(例如2004年)之后一起写作,我也想查询ptolog。我是否只是在更正上面的规则中输入年份数字?

1 个答案:

答案 0 :(得分:0)

让我们采取原始规则。

searchlocalLib(W,E,_,_,_,_):- localLib((W1,W2),E,_,_,_,_).

它有两个主要问题。首先,这条规则假设如果同一本书中有两位作者,那么库条目(localLib/6)有一个元组,作者是第一个参数。在您的知识库中并非如此,您只需为每本书的每位作者使用一个条目:

localLib(‘AHorowitz’, ‘Night Visitors’, 2000, ‘Stormbreaker’, 240, 2).
...
localLib(‘AJohnston’, ‘Night Visitors’, 2000, ‘Stormbreaker’, 240, 2).

其次,有三个单例变量(WW1W2)。使用此规则不会实例化变量W。该规则缺少一些统一,如W = [W1, W2](忽略第一个问题)。


您需要使用自然语言表达您将使用明确的条款在Prolog中代表的内容。类似的东西:

作者W1W2如果有两个不同的图书馆条目,则会在T年内一起写一本书Y ...

然后尝试在Prolog中将其表示为规则:

twoAuthors(T, [W1, W2], Y):-
    locallib(W1, T, Y, ...),
    locallib(W2, T, Y, ...),
    W1 \== W2.

对于在特定年份之后撰写的条目,请参阅this answer以查找类似问题。