2014-10-22 56 views
0

我在一本字典类节目正在与序言,我的代码是这样的:在Prolog我怎么可以削减多余的答案

define(car,vehicle). 
define(car,that). 
define(car,has). 
define(car,four). 
define(car,wheels). 
define(wheels,round). 
define(wheels,object). 
define(wheels,used). 
define(wheels,in). 
define(wheels,transportation). 


defined(X):-define(X,_). 

anotherdefined(X):- \+ undefined(X). 
undefined(X):- \+define(X,_).   

我想写一个定义/ 1谓词,这将给我:

?-defined(X). 
X = car ; 
X = wheels ; 
false. 

然而,我的定义/ 1给了我X=car. 5次(自然)为每次它抵抗define(car,_). 和我anotherdefined/1给了我唯一的true.什么方法停止序言回溯到其他实例define(car,_).,并跳至define(wheels,_).

编辑:我写了下面的行得到的结果我想givedefinedword/1,

listdefined(X):-findall(Y,defined(Y),Z),sort(Z,X). 
givedefinedword(X):-listdefined(List),member(X,List). 

然而,因为我想一个有效的谓词(我将在许多人使用),它打败目的。这个谓词做了太多的过程。

或者,使用修饰代码的谓词会更好吗?例如准备一个定义的单词列表,并在添加新定义时对其进行修改。

谢谢。

+1

请参阅'bagof/3'和'setof/3'。 – 2014-10-22 06:23:27

回答

0

如果更改define到相关项目,并列出,像

definelist(car, [vehicle, that, has, four, wheels]). 
% etc. 
defined(X) :- definelist(X, _). 

然后defined将不再会产生重复,也不需要线性空间。

当然,查询define(X, Y)现在必须执行为definelist(X, L), member(Y, L)。如果你希望这也是有效的,你可能需要复制所有的定义。

+0

谢谢,我认为现在是我开始按照列表思考的时候了。 “你可能需要复制所有定义”是什么意思? – 2014-10-23 01:32:33

+0

@MericUsta你会定义(汽车,车辆)以及我建议的'definelist',并将所有的定义放在两个谓词中。我实际上并不推荐这样做,但如果速度很重要,有办法将其自动化,因此您不必手动复制所有内容。 – 2014-10-23 07:03:43

0

你想用你的程序实现什么?看来你想拥有的形式事实:

“汽车是具有四个车轮的车辆”

“轮是在运输中使用的圆形物体”(有点含糊)

如何你打算使用这些事实吗? @larsmans建议如果完全没问题,如果你只想把你的陈述作为一个“句子”。这实际上取决于你将如何处理这些信息。

考虑结构化数据库中的信息:鉴于这种数据库

is(car, vehicle). 
is(bicycle, vehicle). 
is(boat, vehicle). 
has(car, wheel(four)). 
has(car, motor). 
has(bicycle, wheel(two)). 

,你至少可以问一个问题一样,“什么车有哪些?”,“没有自行车有一个电机?”,或者可能是“一辆车有多少个车轮?”,或者“哪些车辆没有车轮?”。

?- is(X, vehicle). 
?- has(bicycle, motor). 
?- has(car, wheel(N)). 
?- is(X, vehicle), \+ has(X, wheel(_)). 

等等。

一旦你更好地定义了你的问题,你可以更好地定义你的数据结构,这将使编写一个程序来解决你的问题更容易。

+0

谢谢你的评论,它给了我一些很好的见解。现在我更关心单词的定义..(当然,目前只是假定义),但也可能会在后面进行分类。 – 2014-10-23 01:37:48