SWI-prolog中的动态规则断言

SWI-prolog中的动态规则断言,prolog,metaprogramming,Prolog,Metaprogramming,我试图使用SWI prolog将规则动态添加到知识库中,其中规则体事先未知 所需的规则如下所示: rule(a) :- fact(1), fact(2). 通常你会简单地说 assert((rule(a):-fact(1),fact(2))). 但问题是事实是在运行时确定的(在断言之前,事实的数量也是未知的) 这就是为什么我想知道是否有可能断言一个规则,其中主体由一系列事实组成,例如[事实(1),事实(2)]我们将创建一个规则新规则(X):-w,X,y,z(X) 规则的主体是一个元组,一种形

我试图使用SWI prolog将规则动态添加到知识库中,其中规则体事先未知

所需的规则如下所示:

rule(a) :- fact(1), fact(2).
通常你会简单地说

assert((rule(a):-fact(1),fact(2))).
但问题是事实是在运行时确定的(在断言之前,事实的数量也是未知的)


这就是为什么我想知道是否有可能断言一个规则,其中主体由一系列事实组成,例如
[事实(1),事实(2)]
我们将创建一个规则
新规则(X):-w,X,y,z(X)

规则的主体是一个元组,一种形式为(w,x,y…)的构造

对于不同的主体长度,从无主体开始:

assert(goal).  
assert(goal:-cond).  
assert(goal:-(cond1,cond2)).
元组运算符是逗号(`,'),如“,”(a,b)=(a,b)

--

有两个列表。第一个列表是在
create\u a\u rule()
中调用
listing()
的结果。第二个清单来自最后一行的
listing()
命令

?- [runtime].
:- dynamic newrule/1.

newrule(A) :-
    w,
    x,
    y,
    z(A).

:- dynamic newrule/1.

newrule(A) :-
    w,
    x,
    y,
    z(A).

% runtime compiled 0.01 sec, 1,448 bytes
true.

建议对弗雷泽的清单进行修改:

list_to_tuple([X],X).

list_to_tuple([A,B],(A,B)).

list_to_tuple([A,B|T],(A,B,Rest_Tuple)) :-
    list_to_tuple(T,Rest_Tuple).
如果第一个变量是空列表,则这些子句不需要异常:它将简单地失败。这也意味着在回溯时,您永远不会碰到断言


然而,您可能仍然希望exception子句就位,因此您仍然可以将其放入以捕获尝试与[]统一的情况。(不过,回溯时它不会命中。)

非常感谢您提供了完美且非常详细的解决方案@汤姆:如果答案是“完美的”,你为什么不接受呢?这个答案中的谓词在SWI Prolog中被弃用了。
list_to_tuple([X],X).

list_to_tuple([A,B],(A,B)).

list_to_tuple([A,B|T],(A,B,Rest_Tuple)) :-
    list_to_tuple(T,Rest_Tuple).