使用prolog中的列表获取单元格的值

使用prolog中的列表获取单元格的值,prolog,Prolog,我试图在prolog中实现一个谓词,其中给定任何带有数据的示例表,表索引[+I,+J]的内容应该打印在终端上。在这种情况下,, 以下是谓词的原型: get_table_values_单元格([+I,+J],+table,-ContentsL) 样本输出: ?- table(sample_table4,Data),get_table_values_cell([3,2],Data,CL). Data = [[["11"], ["21"], ["31"], ["41"]], [["12"], ["2

我试图在prolog中实现一个谓词,其中给定任何带有数据的示例表,表索引[+I,+J]的内容应该打印在终端上。在这种情况下,, 以下是谓词的原型:
get_table_values_单元格([+I,+J],+table,-ContentsL)
样本输出:

?- table(sample_table4,Data),get_table_values_cell([3,2],Data,CL).
Data = [[["11"], ["21"], ["31"], ["41"]], [["12"], ["22"], ["32"]],
[["13"], ["23"]], [["14"]]],
CL = ["32"].

提前谢谢

使用
nth0/3
nth1/3
(内置预分类)可以轻松解决此问题,例如:

get_table_values_cell([R,C],L):-
    Data = [
           [["11"], ["21"], ["31"], ["41"]], 
           [["12"], ["22"], ["32"]],
           [["13"], ["23"]], 
           [["14"]]
           ],
    nth1(R,Data,L1),
    nth1(C,L1,L).

?- get_table_values_cell([3,2],CL).
CL = ["23"].
getElement1(C,C,[H|_],H):- !. %the cut is not mandatory    
getElement1(Current,Max,[_|T],Lout):-
    Current < Max,
    C is Current+1,
    getElement1(C,Max,T,Lout).
要在不使用
nth0/3
nth1/3
的情况下解决它,您可以用以下方式编写自己的“find”(这里称为
getElement1/4
)谓词:

get_table_values_cell([R,C],L):-
    Data = [
           [["11"], ["21"], ["31"], ["41"]], 
           [["12"], ["22"], ["32"]],
           [["13"], ["23"]], 
           [["14"]]
           ],
    nth1(R,Data,L1),
    nth1(C,L1,L).

?- get_table_values_cell([3,2],CL).
CL = ["23"].
getElement1(C,C,[H|_],H):- !. %the cut is not mandatory    
getElement1(Current,Max,[_|T],Lout):-
    Current < Max,
    C is Current+1,
    getElement1(C,Max,T,Lout).

顺便说一句,我建议您使用内置谓词。

您能描述一下您的尝试并询问具体的卡住位置吗?我很难理解如何通过给定的列表找到给定的索引(在本例中,指向[3,2]的单元格“坐标”)并打印出值(在本例中为“32”)在该位置。阅读有关谓词
nth0/3
nth1/3
的序言文档。