如何将子句的主体转换为列表?

时间:2016-12-17 17:25:28

标签: prolog

我有一个看起来像这样的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专家的任何建议吗?

2 个答案:

答案 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).