对规则头和规则体的混淆?
Confusion over rule head and and rule body?
我正在尝试从给定的关于本地图书馆的知识库中编写一条规则,以便我查看是否有两位作家一起写过一篇文章。
这是正在使用的知识库。
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).
知识库的密钥如下:
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,所以查询将无法正常工作,请问我可以得到一些指导吗?
还说我还想查询 ptolog 是否有两位作家在指定年份(例如 2004 年)之后一起写作。更正后我是否只在上面的规则中输入年份数字?
我们还是沿用原来的规则吧。
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).
其次,存在三个单例变量(W
、W1
、W2
)。使用此规则不会实例化变量 W
。该规则缺少一些统一,例如 W = [W1, W2]
(忽略第一个问题)。
您需要用自然语言表达您稍后在 Prolog 中使用定语从句表示的内容。类似于:
作者 W1
和 W2
在 Y
年一起写了一本书 T
如果有两个不同的图书馆条目...
然后尝试在 Prolog 中将其表示为规则:
twoAuthors(T, [W1, W2], Y):-
locallib(W1, T, Y, ...),
locallib(W2, T, Y, ...),
W1 \== W2.
对于某个特定年份之后写的条目,请参阅 类似问题。
我正在尝试从给定的关于本地图书馆的知识库中编写一条规则,以便我查看是否有两位作家一起写过一篇文章。
这是正在使用的知识库。
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).
知识库的密钥如下:
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,所以查询将无法正常工作,请问我可以得到一些指导吗?
还说我还想查询 ptolog 是否有两位作家在指定年份(例如 2004 年)之后一起写作。更正后我是否只在上面的规则中输入年份数字?
我们还是沿用原来的规则吧。
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).
其次,存在三个单例变量(W
、W1
、W2
)。使用此规则不会实例化变量 W
。该规则缺少一些统一,例如 W = [W1, W2]
(忽略第一个问题)。
您需要用自然语言表达您稍后在 Prolog 中使用定语从句表示的内容。类似于:
作者 W1
和 W2
在 Y
年一起写了一本书 T
如果有两个不同的图书馆条目...
然后尝试在 Prolog 中将其表示为规则:
twoAuthors(T, [W1, W2], Y):-
locallib(W1, T, Y, ...),
locallib(W2, T, Y, ...),
W1 \== W2.
对于某个特定年份之后写的条目,请参阅