首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对规则头和规则体的困惑?

对规则头和规则体的困惑?
EN

Stack Overflow用户
提问于 2015-01-06 05:04:58
回答 1查看 151关注 0票数 0

我正在尝试从给定的知识库中写一条关于本地库的规则,这样我就可以看到两个作者是否一起写了一篇文章。

这是正在使用的知识库。

代码语言:javascript
复制
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).

知识库的关键如下:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
searchlocalLib(W,E,_,_,_,_):- localLib((W1,W2),E,_,_,_,_). 

然而,我感到非常困惑,因为这看起来不对,因为我觉得我没有在规则头中描述W1和W2 --因此查询将无法工作,请给我一些指导吧?

另外,我还想查询ptolog,如果两个作者在指定的年份(如2004年)之后一起写作的话。当我改正时,我是否只是在上面的规则中输入一个年数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-06 05:51:22

让我们按照原来的规则。

代码语言:javascript
复制
searchlocalLib(W,E,_,_,_,_):- localLib((W1,W2),E,_,_,_,_).

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

代码语言:javascript
复制
localLib(‘AHorowitz’, ‘Night Visitors’, 2000, ‘Stormbreaker’, 240, 2).
...
localLib(‘AJohnston’, ‘Night Visitors’, 2000, ‘Stormbreaker’, 240, 2).

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

您需要用自然语言表达您以后将在Prolog中使用一个限定子句表示的内容。类似于:

作者W1W2Y中共同写了一本书,如果有两个不同的库条目.

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

代码语言:javascript
复制
twoAuthors(T, [W1, W2], Y):-
    locallib(W1, T, Y, ...),
    locallib(W2, T, Y, ...),
    W1 \== W2.

有关某个特定年份之后编写的条目,请参见this answer中的类似问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27792395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档