gpt4 book ai didi

prolog - SWI-prolog中的动态规则声明

转载 作者:行者123 更新时间:2023-12-04 12:14:07 28 4
gpt4 key购买 nike

我正在尝试使用SWI-prolog将规则动态添加到知识库中,其中该规则的主体事先未知。
所需的规则如下所示:

rule(a) :- fact(1), fact(2).
通常,您只需声明
assert((rule(a):-fact(1),fact(2))).
但是问题在于事实是在运行时决定的(事实的数量在断言之前也是未知的)。
这就是为什么我想知道是否有可能声明一个规则,其中主体由事实列表组成,例如 [fact(1), fact(2)]

最佳答案

我们将创建一个规则newrule(X) :- w,x,y,z(X)
规则的主体是一个元组,是(w,x,y ...)形式的构造。

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

assert(goal).  
assert(goal:-cond).
assert(goal:-(cond1,cond2)).

元组运算符是逗号(`,'),如','(a,b)==(a,b)。
%%%%
%%%% Name: runtime.pl -- Runtime rule insertion.
%%%%
create_a_rule :-
Cond=[w,x,y,z(X)],
Head=newrule(X),
list_to_tuple(Cond,Body),
dynamic(Head),
assert(Head :- Body),
listing(Head).

/*
This is a [l,i,s,t], and this is a (t,u,p,l,e).
Convertng list to tuple:
[] -> undefined
[x] -> (x) == x
[x,y] -> (x,y).
[x,y,z..whatever] = (x,y,z..whatever)
*/

list_to_tuple([],_) :-
ValidDomain='[x|xs]',
Culprit='[]',
Formal=domain_error(ValidDomain, Culprit),
Context=context('list_to_tuple','Cannot create empty tuple!'),
throw(error(Formal,Context)).

list_to_tuple([X],X).

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

:- create_a_rule.
:- listing(newrule).

--

有两个 list 。第一个 list 是由 listing()中的 create_a_rule()导致的。第二个 list 来自最后一个源代码行中的 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.

关于prolog - SWI-prolog中的动态规则声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4065388/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com