更改子句顺序 prolog [数据库操作]



我确实实现了一条规则invert(+PredicateSymbol, +Arity),该规则颠倒了数据库上谓词PredicateSymbol/Arity的顺序。

例如:

以前:

vote(john, ['A'-7, 'B'-9, 'C'-6]).
vote(jack, ['A'-8, 'B'-8, 'C'-7]).
vote(peter, ['C'-4, 'D'-7, 'E'-3]).
vote(harry, ['A'-7, 'C'-6]).
vote(richard, ['A'-10, 'D'-10, 'F'-9]).
| ?- invert(vote,2).
yes

后:

vote(richard, ['A'-10, 'D'-10, 'F'-9]).
vote(harry, ['A'-7, 'C'-6]).
vote(peter, ['C'-4, 'D'-7, 'E'-3]).
vote(jack, ['A'-8, 'B'-8, 'C'-7]).
vote(john, ['A'-7, 'B'-9, 'C'-6]).

我不知道该怎么做,因为它必须用给定的arity反转任何子句......

此问题有两种解决方案。

1(

只要你的谓词是动态的,并且由简单的事实组成(没有头:-身体从句(,这就可以了:

reverse(F/A) :-
    functor(Pred,F,A),
    retract(Pred),
    asserta(Pred),
    fail.
reverse(_).

例如:

?- reverse(vote/2).
true.
?- vote(X,_).
X = richard ;
X = harry ;
X = peter ;
X = jack ;
X = john.

2(

如果您打算以相反的顺序获取谓词解决方案,这适用于具有有限数量解决方案的任何谓词:

revaux([_|Rest],Next) :-
    revaux(Rest,Next).
revaux([X|_],X).
reverse_order(Pred) :-
    copy_term(Pred,QueryPred),
    findall(QueryPred,QueryPred,AllSols),
    !,
    revaux(AllSols,Pred).

例如:

?- vote(X,_).
X = john ;
X = jack ;
X = peter ;
X = harry ;
X = richard.
?- reverse_order(vote(X,_)).
X = richard ;
X = harry ;
X = peter ;
X = jack ;
X = john.

最新更新