[英]Acessing position i,j in prolog (joining predicates)
谁能告诉我如何加入这两个谓词,
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)。
谢谢你的帮助
我运行了您的代码,并修复了一些看来是印刷错误的内容,并进行了一些非必然的更改,它似乎可以正常工作:
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).
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.