gpt4 book ai didi

prolog - 如何在prolog中描述交换规则?

转载 作者:行者123 更新时间:2023-12-02 01:49:17 26 4
gpt4 key购买 nike

我打算在我的数据库中描述“规则是可交换的”,一个直接的想法就是像代码一样。

certain_rule(X,Y) :- X = struct(_X,Others) , Y = some_process_base_on(_X).
certain_rule(Y,X) :- X = struct(_X,Others) , Y = some_process_base_on(_X).

但是如果X未绑定(bind),它会让X直接与struct(_X,Others)绑定(bind),然后some_process_base_on( _X) 将是未知的。现在我的解决方案是在分割X之前插入compound(X)

通常,compound/1不够严格,会引入一些意想不到的东西,functor/3可能是一个更好的解决方案,但会存在太多规则,因为太我需要比较许多仿函数,即使我使用 member/2 在列表中查找仿函数,我仍然构造了太多组合。

有没有更好的方法来描述“交换”,顺便说一句,有没有更好的方法来筛选一些指定的结构?

最佳答案

首先,请注意您的子句相当于编写:

certain_rule(struct(X,_), some_process_base_on(X)).
certain_rule(some_process_base_on(X), struct(X,_)).

筛选有效结构的一个可能的解决方案是使用有效结构表。例如:

valid_structure(-) :-
!,
fail.
valid_structure(struct(_,_)).
valid_structure(some_process_base_on(_)).
...

第一个子句将筛选出变量,同时保留谓词的第一个参数索引。然后,您可以定义一个网守谓词:

certain_rule_gatekeeper(X, Y) :-
once((valid_structure(X); valid_structure(Y))),
certain_rule(X, Y).

为了解决交换性问题,下面的定义是否适用于您的具体情况?

certain_rule_gatekeeper(X, Y) :-
once((valid_structure(X); valid_structure(Y))),
once((certain_rule(X, Y); certain_rule(Y, X))).

certain_rule/2 谓词仅使用上述子句之一的示例调用(从而避免重复信息):

| ?- certain_rule_gatekeeper(X, Y).               
no

| ?- certain_rule_gatekeeper(struct(X,_), Y).
Y = some_process_base_on(X)
yes

| ?- certain_rule_gatekeeper(Y, struct(X,_)).
Y = some_process_base_on(X)
yes

| ?- certain_rule_gatekeeper(some_process_base_on(X), Y).
Y = struct(X,_)
yes

| ?- certain_rule_gatekeeper(Y, some_process_base_on(X)).
Y = struct(X,_)
yes

关于prolog - 如何在prolog中描述交换规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55363995/

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