我是一名大学生并正在从事AI项目,我们需要使用prolog设计一个程序。
我们是初学者,所以它将成为一个非常基本的程序,我们不需要设计任何接口或类似的东西。
该程序的这个想法是它将向用户显示一些成分(日记,肉,奶酪等),并在用户选择他们想要的成分后,程序将建议可以使用的配方选定的成分。
我想说我们到现在为止是规则,循环,条件,列表......等等。
我们只想知道如何订购规则和内容以使其有效?
提前感谢!
答案 0 :(得分:0)
我们想知道我们如何订购规则和内容以使其有效?
在回答问题之前,我们先谈谈使用笔和纸的人可能会使用的一些简单想法,然后调整它以与Prolog一起使用。
对于这个问题,我们将认为食谱只是成分的集合,而不是如何准备成分的说明。
以下是一些简单的食谱:
tacos - shells, ground beef, spices, lettuce, cheese
steak - steak, spices
spaghetti -ground beef, spaghetti noodles, tomato sauce, spices
现在,如果我们有pork
和spices
,我们无法制作食谱。如果我们有steak
和spices
我们可以做牛排。所以我们在Prolog中做到这一点
为食谱制作一个事实:
recipe(steak, steak, spices).
以及查询我们是否可以制作食谱:
?- recipe(X, steak, spices).
X = steak.
现在别人尝试
?- recipe(X, spices, steak).
false.
显然有些东西不起作用。根据经验,我知道问题是我们没有使用canonical form。对于这个问题,如果我们只是对食谱的成分进行分类,然后确保对quires的成分进行分类,那么它将比较规范形式并解决问题。此外,如果我们将成分转换为列表,我们可以使用内置谓词进行排序(sort/2),例如
?- sort([steak, spices],I).
I = [spices, steak].
?- sort([spices, steak],I).
I = [spices, steak].
现在使用规范形式和成分列表我们得到一个食谱
recipe(steak, [spices, steak]).
并进行查询,对我们得到的输入成分进行排序
can_make(I,R) :-
sort(I,Is),
recipe(R,Is).
?- can_make([steak,spices],R).
R = steak.
?- can_make([spices,steak],R).
R = steak.
添加新配方应该很简单:
recipe(tacos, [cheese, ground_beef, lettece, shells, spices]).
recipe(spaghetti, [gound_beef, spaghetti_noddles, spices, tomato_sauce]).
并快速检查
?- can_make([tomato_sauce, gound_beef, spices, spaghetti_noddles], R).
R = spaghetti.
?- can_make([spices,pork],R).
false.
这应该让你开始。希望我没有给你完整的答案,因为它是家庭作业,你应该有一些东西需要解决。