在子列表列表中查找元素的出现

时间:2018-02-27 20:06:29

标签: list prolog

我正在研究一个Prolog程序,该程序在给出一组产品后会生成一个CYK解析表。我被困在形成第1行,它创建了一个包含给定终端可以从中派生的所有非终端的单元(列表)。这是我到目前为止所得到的:

以下是产品(大写=非终端,小写=终端):

    SELECT 
    Sum(T.SumOfASSIGN_HOURS) AS SumOfSumOfASSIGN_HOURS, 
    Sum(T.SumOfASSIGN_CHARGE) AS SumOfSumOfASSIGN_CHARGE
  FROM (
    SELECT ASSIGNMENT.PROJ_NUM, SUM(ASSIGNMENT.ASSIGN_HOURS) AS SumOfASSIGN_HOURS,
    SUM(ASSIGNMENT.ASSIGN_CHARGE) AS SumOfASSIGN_CHARGE
    FROM (ASSIGNMENT)
    GROUP BY ASSIGNMENT.PROJ_NUM) T ;

这是我目前的'解决方案'(它很接近但不正确):

productions(book,[["S","AB"],["S","BB"],["A","CC"],
                  ["A","AB"],["A","a"],["B","BB"],
                  ["B","CA"],["B","b"],["C","BA"],
                  ["C","AA"],["C","b"]]).

最后,这是我与输出一起调用的目标。它返回一个包含正确元素的列表(使用“a”调用应该只列出[“A”],“b”应该给出[“B”,“C”]的列表),但它给了我一堆额外的输出。

form_row1_cell(StringElement,ProductionsList,Row1Cell) :- 
    form(StringElement,ProductionsList,Row1Cell).

form(_,[],[]).
form(A,[[X,Y]|T],[R|Rtail]) :- member(A,[X,Y]), !, R=X, form(A,T,Rtail).
form(A,[_|T],[_|Rtail]) :- form(A,T,Rtail).

所以,你看到“A”在结果列表中,这是正确的,但我无法弄清楚为什么它给了我所有额外的东西。我假设我没有正确执行递归,我仍然是Prolog的新手。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

问题在于form/3的第三个定义:而不是这个

form(A,[_|T],[_|Rtail]) :- form(A,T,Rtail).

你应该写

form(A,[_|T],L):- form(A,T,L).

这样就可以避免在列表中添加未定义的元素。