如何创建列表列表

时间:2017-04-08 20:00:48

标签: prolog

我遇到谓词的问题,例如创建列表列表

?-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]).

2 个答案:

答案 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对我来说似乎很好。

注意你如何在的头部收集结果,而不是在递归调用中收集结果!