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.

然而,我的 defined/1X=car.每次计数器都会给我五次(自然),define(car,_). 而我的 anotherdefined/1 只给我true.什么方法可以停止 prolog 回溯到其他实例define(car,_).并跳到define(wheels,_).

编辑:我写了以下几行来获得我想要的结果与 givedefinedword/1,

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

但是,由于我想要一个有效的谓词(我将在许多其他谓词中使用),所以它超出了目的。这个谓词做了太多的过程。

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

谢谢。

4

2 回答 2

0

如果您更改define为关联项目和列表,例如

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

thendefined将不再产生重复,也不需要线性空间。

当然,define(X, Y)现在必须以definelist(X, L), member(Y, L). 如果您也希望这也有效,则可能需要复制所有定义。

于 2014-10-22T07:11:38.097 回答
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(_)).

等等。

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

于 2014-10-22T07:31:53.123 回答