我有一个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
和baz
的其他行添加到文件的底部?
如果我理解了这个问题,你想要的是这样的内容:
<>之前ask_bar: -%获取用户输入assertz(酒吧(输入))。foo (X): -酒吧(X)。之前如果这确实是问题所在,您有两个选择:
第一个:将bar/1
声明为动态谓词:
:- dynamic(bar/1).
(这是一个指令,您只需在行首键入:-
。)
第二个:在你的程序中,在引用bar/1
之前,调用谓词retractall/1
,像这样:<>之前主要:retractall(酒吧(_)),%……之前
这将从数据库中删除所有的bar
s, 和将bar/1
声明为dynamic
。