我正在研究一个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的新手。非常感谢任何帮助!
答案 0 :(得分:0)
问题在于form/3
的第三个定义:而不是这个
form(A,[_|T],[_|Rtail]) :- form(A,T,Rtail).
你应该写
form(A,[_|T],L):- form(A,T,L).
这样就可以避免在列表中添加未定义的元素。