如何在 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/1
和 baz/1
未定义。
我试过用占位符值定义它们(即 bar(none).
),但是当用户数据被添加到文件底部时,GNU Prolog 抱怨断言不连续。
是否有另一种方法来定义 bar/1
和 baz/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/1
为 dynamic
。
我有一个具有以下结构的 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/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/1
为 dynamic
。