如何在 GNU Prolog 中定义 dummy/placeholder 谓词

How to define a dummy/placeholder predicate in GNU Prolog

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

% LIBRARY SECTION %

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

% USER DATA SECTION %

% e.g. bar(charlie).

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

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

是否有另一种方法来定义 bar/1baz/1 的 dummy/placeholder 版本,以便 foo(X). 不会失败,并且其他包含 [=19= 的行] 和 baz 可以添加到文件底部吗?

如果我理解这个问题,你想要的是:

ask_bar :-
    % get user input
    assertz(bar(Input)).

foo(X) :-
    bar(X).

如果这确实是问题所在,您有两个选择:

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

:- dynamic(bar/1).

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

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

main :-
    retractall(bar(_)),
    %....

这将从数据库中删除所有 bar 它将声明 bar/1dynamic