如何在GNU Prolog

时间:2015-07-17 07:20:22

标签: prolog 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的虚拟/占位符版本,以便foo(X).不会失败,以便其他行包含bar和{{ 1}}可以添加到文件的底部吗?

1 个答案:

答案 0 :(得分:3)

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

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/1声明为dynamic