1

我有一个具有以下结构的 Prolog 文件:

% LIBRARY SECTION %

foo(X) :- bar(X);
          baz(X).

% USER DATA SECTION %

% e.g. bar(charlie).

该文件的用户数据旨在允许用户扩展,但默认情况下不包含任何内容。但是,这会导致查询foo(X).失败,因为bar/1并且baz/1未定义。

我尝试使用占位符值(即bar(none).)定义它们,但是当用户数据添加到文件底部时,GNU Prolog 抱怨谓词不连续。

是否有另一种方法来定义和的虚拟/占位符版本,bar/1这样baz/1foo(X).不会失败,并且其他包含bar并且baz可以添加到文件底部的行?

4

1 回答 1

3

如果我理解这个问题,您希望得到以下内容:

ask_bar :-
    % 获取用户输入
    断言(bar(输入))。

富(X): -
    酒吧(X)。

如果这确实是问题,您有两种选择:

第一个:声明bar/1为动态谓词:

:- dynamic(bar/1).

(这是一个指令,您只需:-在行首键入。)

第二个:在你的程序中,在任何引用之前bar/1,调用谓词retractall/1,如下所示:

主要的 :-
    收回(酒吧(_)),
    %....

这将从数据库中删除所有bars,并将声明bar/1dynamic.

于 2015-07-17T07:41:07.767 回答