我对序言还比较陌生,我会尽力向大家解释一下。假设我的餐馆知识基础很小,那里有餐厅的名称,美食和价格。
restaurant(spaghetti, italian, 20).
restaurant('naan bread', indian, 30).
...
我有些人喜欢某些餐厅,例如:
likes(adam, restaurant, italian).
亚当喜欢意大利餐馆的地方。我遇到的主要问题是,如果执行以下查询:
likes(adam, spaghetti).
或
likes(adam, _, spaghetti).
不管我放什么,它只会带来错误。我做了很多研究,但似乎无法使它起作用-因为我刚接触Prolog,所以我不太了解。我看过Clocksin和Mellish的著作《 Prolog中的编程》以及各种网站,但我似乎找不到答案或我理解的答案。
答案 0 :(得分:0)
根据您的评论
这只是餐馆的知识库。因此没有其他规则。
我们将从那里开始,从给定的规则开始。
restaurant(spaghetti, italian, 20).
restaurant('naan bread', indian, 30).
接下来是您要尝试的查询
likes(adam, spaghetti).
这是有效的,但正如我们在评论中指出的那样,某些事实缺失。
使查询正确的最简单事实是
likes(adam, spaghetti).
但是您还有其他查询,例如
likes(adam, restaurant, italian).
和类似事实
restaurant('naan bread', indian, 30).
这表明您知道adam
,itialian
和spaghetti
,20
(价格)这四个实体之间存在关联。
建立关系的方法有很多,但是在本例中,我们将更简单一些。
person(adam).
person(mary).
food_nationality(spaghetti, italian).
food_nationality(hamburger, americian).
food_nationality('naan bread', indian).
food_price(spaghetti, 20).
food_price(hamburger, 30).
food_price('naan bread', 30).
likes(adam,italian).
likes(mary,american).
现在,如果您想知道亚当吃他喜欢的食物要花多少钱,我们就有一些事实,我们从事实开始,看看可以得出什么结论。
我们看到了事实
person(adam).
但这只能告诉我们亚当是一个人,并不能为我们的问题提供更多信息。
我们也看到了事实
likes(adam,italian).
告诉我们亚当喜欢意大利,但没有给我们提供特定的食物。
我们也看到了
food_nationality(spaghetti, italian).
所以我们知道亚当喜欢意大利,而意大利人有意粉,但我们仍然需要一个价格。
我们也看到了
food_price(spaghetti, 20).
所以我们知道亚当喜欢意大利,意大利人要意大利面和意粉要花费20。所以答案是,亚当吃他喜欢的东西要花费20。
作为Prolog谓词
cost_to_eat(Person,Price) :-
likes(Person,Nationality),
food_nationality(Food, Nationality),
food_price(Food, Price).
并为亚当运行它
?- cost_to_eat(adam,Price).
Price = 20.
它也适用于玛丽
?- cost_to_eat(mary,Price).
Price = 30.
如果您只给出价格,它也可以使用
?- cost_to_eat(Person,20).
Person = adam ;
false.
它也可以按您的要求进行操作
?- cost_to_eat(Person,Cost).
Person = adam,
Cost = 20 ;
Person = mary,
Cost = 30.
答案 1 :(得分:0)
因此,我们假设您有以下事实,如您的问题所建议,没有任何额外且没有变化:
restaurant(spaghetti, italian, 20).
restaurant('naan bread', indian, 30).
likes(adam, restaurant, italian).
现在您想问一个问题:“亚当喜欢哪道菜?”
我们可以添加以下简单规则:
likes(Person, Dish) :-
likes(Person, restaurant, Type),
restaurant(Dish, Type, _).
现在您可以继续询问以下内容:
?- likes(adam, Dish), write(Dish).
这会给出答案spaghetti
。