规则在prolog程序中排序

时间:2017-03-28 09:11:04

标签: prolog

我是一名大学生并正在从事AI项目,我们需要使用prolog设计一个程序。

我们是初学者,所以它将成为一个非常基本的程序,我们不需要设计任何接口或类似的东西。

该程序的这个想法是它将向用户显示一些成分(日记,肉,奶酪等),并在用户选择他们想要的成分后,程序将建议可以使用的配方选定的成分。

我想说我们到现在为止是规则,循环,条件,列表......等等。

我们只想知道如何订购规则和内容以使其有效?

提前感谢!

1 个答案:

答案 0 :(得分:0)

  

我们想知道我们如何订购规则和内容以使其有效?

在回答问题之前,我们先谈谈使用笔和纸的人可能会使用的一些简单想法,然后调整它以与Prolog一起使用。

对于这个问题,我们将认为食谱只是成分的集合,而不是如何准备成分的说明。

以下是一些简单的食谱:

tacos - shells, ground beef, spices, lettuce, cheese
steak - steak, spices
spaghetti -ground beef, spaghetti noodles, tomato sauce, spices

现在,如果我们有porkspices,我们无法制作食谱。如果我们有steakspices我们可以做牛排。所以我们在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.

这应该让你开始。希望我没有给你完整的答案,因为它是家庭作业,你应该有一些东西需要解决。