8

我现在检查 X(Y) 在我的小数据库中不是一个公认的事实。由于 X(Y) 返回 false,它将尝试断言它。(我意识到当 X 是规则而不是事实时,这会带来问题)

ifNotAdd(X,Y):-
    not(call(X,Y)),
    !,
    assert(X(Y)).

例如,假设这个事实在数据库中

mammal(dolphin).

我问 ifNotAdd(哺乳动物,大象)。

我想让它看到吗?哺乳动物(大象)。为假,然后断言哺乳动物(大象)。

显然是“断言(X(Y))”。线是错误的,但我用什么来代替它?我正在搜索序言文档和论坛来寻找答案,但到目前为止还没有运气。我也在尝试写一些可以自己完成的东西。

编辑 我需要编辑数据库以获得用户可以与之交互的动态数据库。我正在构建一个论证机器,我需要允许用户告诉系统他们“肯定知道事实”,以便系统可以处理其领域之外的知识。

http://en.wikipedia.org/wiki/Reason_maintenance的脉络中

干杯,

4

1 回答 1

8

您可以在断言它之前使用univ 运算符 =../2来构造术语(注意,有问题的谓词必须声明为动态的才能工作):

ifNotAdd(X,Y):-
    not(call(X,Y)),
    !,
    Term =.. [X, Y],
    assert(Term).

顺便说一句,如果您不想ifNotAdd/2在不需要将事实添加到数据库时失败,您应该将其包装在 if 结构中,另外,not/1不推荐使用,(\+)/1是首选:

:- dynamic(mammal/1).

mammal(dolphin).

ifNotAdd(X, Y):-
    (   \+ call(X, Y)
     -> Term =.. [X, Y],
        assert(Term)
     ;  true).

但我不确定你正在尝试做的事情就在那里。很多时候,当 prolog 的初学者想要操作数据库时,这是因为没有正确理解特定的 prolog 机制。话又说回来,你可能不是初学者,我的话可能很愚蠢,在这种情况下,算了吧!但是,如果您确实是初学者,您可能想在此处准确说明您要达到的目标,以便我们可以确认是否需要这些操作!

于 2011-12-25T02:26:50.370 回答