更改条款订单Prolog [数据库操作]

时间:2017-11-16 22:12:35

标签: 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 个答案:

答案 0 :(得分:0)

这个问题有两个解决方案。

1)

只要你的谓词是动态的并由简单的事实组成(没有头: - body子句),这就有效:

testJoinSmallAndBig

例如:

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

2)

如果您的目的是以相反的顺序获得谓词解,那么这适用于任何具有有限数量解的谓词:

?- reverse(vote/2).
true.

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

例如:

revaux([_|Rest],Next) :-
    revaux(Rest,Next).
revaux([X|_],X).

reverse_order(Pred) :-
    copy_term(Pred,QueryPred),
    findall(QueryPred,QueryPred,AllSols),
    !,
    revaux(AllSols,Pred).