我有一个看起来像这样的Prolog条款:
inorder :- true(cell(1, 1, 1)), true(cell(1, 2, 2)), true(cell(1, 3, 3)),
true(cell(2, 1, 4)), true(cell(2, 2, 5)), true(cell(2, 3, 6)),
true(cell(3, 1, 7)), true(cell(3, 2, 8)), true(cell(3, 3, b)).
我想转换成一个列表(比如说L):
L = [cell(1, 1, 1), cell(1, 2, 2), cell(1, 3, 3),
cell(2, 1, 4), cell(2, 2, 5), cell(2, 3, 6),
cell(3, 1, 7), cell(3, 2, 8), cell(3, 3, b)].
明显的启动方式似乎是:
clause(inorder, Body).
但这会产生:
Body = (true(cell(1, 1, 1)), true(cell(1, 2, 2)), true(cell(1, 3, 3)), true(cell(2, 1, 4)), true(cell(2, 2, 5)), true(cell(2, 3, 6)), true(cell(3, 1, 7)), true(cell(..., ..., ...)), true(cell(..., ..., ...))).
我不确定如何提取" trues"从?那里有Prolog专家的任何建议吗?
答案 0 :(得分:3)
我不确定为什么你会有一个像// corrected version
triangleVertices.push(new B2Vec2(width / 2, 0.0)); // top
triangleVertices.push(new B2Vec2(width, heightM)); // right
triangleVertices.push(new B2Vec2(0.0, height)); // left
那样的构造,或者为什么你会重用保留的Prolog词inorder
作为一个算子,但是你可以打破它像这样:
true
我怀疑,在更大的背景下,可能有一种更明智的方式来实现你正在做的事情。
答案 1 :(得分:0)
我已经改写了潜伏者对更通用解决方案的回答,也改写了我可能更新手级别的Prolog。
dburi = "file:TESTING_MEMORY_DB?mode=memory&cache=shared"
lsc = LockableSqliteConnection(dburi)
with lsc:
lsc.cursor.execute("SQL")
诀窍是摆脱结果列表前面的'='位置'。'
然后从true(Base)中提取Bases列表就像
一样clause_body_list(Clause, List) :-
clause(Clause, Body),
clause_body_list_aux(Body, List).
clause_body_list_aux(Element, [Element]) :-
Element =.. [_Term1, _Term2].
clause_body_list_aux(Elements, [Term|Terms]) :-
Elements =.. [_, Term|[Elements1]],
clause_body_list_aux(Elements1, Terms).