我遇到谓词的问题,例如创建列表列表
?-listoflist([p v q, p, r], R).
R=[ [p,q],[p],[r] ]
到目前为止,我有:
:- op(500, xfy, v).
listoflist([],[]):-!.
listoflist([H], [[H]]):-!
listoflist([H|T], [Result]):-
change_to_list(H,Tmp),
listoflist(T, [Tmp|Result])..
change_to_list(X v Y, [X|List]):-
change_to_list(Y,List),!.
change_to_list(X,[X]).
答案 0 :(得分:2)
对于操作员声明,请始终查看Prolog已有的内容,并将自己的操作符合并到其中:
?- current_op(Pri,Fix,\/).
Pri = 500,
Fix = yfx.
左关联运算符在这里更有意义。也许你可以重复使用它,而不是定义自己的?如果您想要自己的,请采用相同的优先级。
:- op(500, yfx, v).
operands(Op) --> [Op], {functor(Op,Op,0)}.
operands(L v R) --> operands(L), operands(R).
expr_operands(Expr, Ops) :-
phrase(operands(Expr), Ops).
?- maplist(expr_operands, [p v q, p, r], R).
R = [[p,q],[p],[r]].
答案 1 :(得分:0)
您的listoflists/2
应该更简单,不需要削减:
listoflists([], []).
listoflists([X|Xs], [Y|Ys]) :-
change_to_list(X, Y),
listoflists(Xs, Ys).
另一个谓词change_to_list/2
对我来说似乎很好。
注意你如何在的头部收集结果,而不是在递归调用中收集结果!