我已经实现了一个规则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反转任何子句......
答案 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).