2017-04-08 124 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