我有一个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
的虚拟/占位符版本,以便foo(X).
不会失败,以便其他行包含bar
和{{ 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
。