0

谁能告诉我如何加入这两个谓词,

listAt([L1|L2], 0, L) :- L = L1.
listAt([L1|L2], I, L) :- I1 is I - 1, listAt(L2, I1, L). 
%return list index I from list of lists

valAt([H|T], 0, V) :- V = H.
valAt([H|T], J, V) :- J1 is I - 1, valAt(T, J1, V).
%returns element index J of list

,所以我可以从列表列表中访问元素 [i][j] 吗?

我可以通过编写手动完成

| ?- listAt( [ [1,2,3], [4,5,6] ], 1, L), valAt(L, 1, V).
L = [4,5,6],
V = 5 ?
yes

,但如果在 .pl 文件中我写

At([H|T],I,J,X) :- 
listAt([H,T],I,V),
valAt(V,J,X).

,我得到

在表达式 ( [H|T] , I , J , X ) 之后需要运算符:- listAt ( [H|T] , I , V ) , valAt ( V , J , X ) 。

感谢您的帮助

4

1 回答 1

0

我运行了您的代码并修复了一些似乎是印刷错误的问题,并进行了一些无关紧要的更改,它似乎工作正常:

listAt([HL|_], 0, HL).           %EDIT: used '_' for a term not used; compress
listAt([_|TL], I, L) :-          %EDIT: used '_' for a term not used
    I1 is I - 1,
    listAt(TL, I1, L).
%return list @ index I from list of lists

valAt([H|_], 0, H).              %EDIT: used '_' for a term not used; compress
valAt([_|T], J, V) :-            %EDIT: used '_' for a term not used
    J1 is J - 1,                 %FIXED: replaced I with J
    valAt(T, J1, V).
%returns element @ index J of list

at(L, I, J, X) :-                %FIXED: Changed "At" to "at"; changed [H|T] to L
    listAt(L, I, V),             %FIXED Changed [H,T] to L
    valAt(V, J, X).

还有一个例子:

| ?- at( [[1,2,3],[4,5,6],[7,8,9]], 2, 2, X).

X = 9 ? ;

no
| ?-

| ?- at([[1,2,3],[4,5,6]], 1, 1, X ).

X = 5 ? ;

(1 ms) no
| ?-

注意谓词中未使用的术语使用下划线。如果您在 Prolog 中使用了一个未实例化的术语,您将收到“单例”警告。在 Prolog 中,如果您需要在某个位置使用术语但不需要使用它,您可以使用_或以下划线开头的变量名(例如,_List)。

请注意,您也可以在谓词头中直接实例化。因此,您可以listAt([L1|_], 0, L) :- L = L1.简单地替换为listAt([HL|_], 0, HL)..

于 2013-10-15T22:41:26.030 回答