我确实实现了一条规则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.