2017-04-08 121 views
-1

具有谓词一个问题,例如创建名单列表如何创建列表的列表

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

回答

1

对于运营商的声明,始终是什么序言已经已经和适合你自己的运营商:

?- 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]]. 
+0

我真想带我自己的操作员。你能帮我写谓词女巫吗? – asdfgh

+0

您是否尝试过我的解决方案? – false

0

listoflists/2应该是简单,不需要削减:

listoflists([], []). 
listoflists([X|Xs], [Y|Ys]) :- 
    change_to_list(X, Y), 
    listoflists(Xs, Ys). 

其他谓词,change_to_list/2似乎没什么问题。

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

+1

'change_to_list/2'并不坚定,至少可以说... – false