繁体   English   中英

序言中的位置i,j(联合谓词)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM