我正在开发一个涉及图形的项目,我有一个属性变量列表,每个属性变量代表图中的一个节点.每个节点都有几个属性,例如相邻节点,起始节点的距离等.我想从列表中删除单个节点,但是当我使用delete时,我收到以下错误:
ERROR: uhook/3: Undefined procedure: adjs:attr_unify_hook/2
Run Code Online (Sandbox Code Playgroud)
例如,如果我包含delete(OldVertices, Node, NewVertices)在我的程序中,则会出现此错误.
如果我将顶点存储在二进制堆中,并尝试使用从堆中删除顶点,我也会得到完全相同的错误delete_from_heap.
我能够成功地使用删除和delete_from_heap节点,如果我第一次删除它的所有属性,但这会导致我的程序出现问题,因为我想稍后使用这些属性; 我只是不希望节点包含在列表或二进制堆中.
这是一个错误,还是我错误地处理属性变量?
谢谢!这适用于列表.现在我尝试做类似的事情从二进制堆中删除属性变量.我有一个规则
delheap(Heap, Key, NewHeap) :-
delete_from_heap(Heap, A1, A0, NewHeap),
get_attr(Key, dist, A1),
A0 == Key.
Run Code Online (Sandbox Code Playgroud)
但是,当我测试时,我得到以下结果:
?- TLO = [3-A, 4-B], put_attr(A, dist, 3), put_attr(B, dist, 4), list_to_heap(TLO, H), delheap(H, A, Hq).
Correct to: "dijkstra_av:delheap(H,A,Hq)"? yes
TLO = [3-A, 4-B], H = heap(t(A, 3, [t(B, 4, [])]), 2), Hq = heap(t(B, 4, []), 1), put_attr(A, dist, 3), put_attr(B, dist, 4).
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,但当我尝试使用B时:
?- TLO = [3-A, 4-B], put_attr(A, dist, 3), put_attr(B, dist, 4), list_to_heap(TLO, H), delheap(H, B, Hq).
Correct to: "dijkstra_av:delheap(H,A,Hq)"? yes
TLO = [3-A, 4-B], false.
Run Code Online (Sandbox Code Playgroud)
我能够通过优先级而不是密钥调用delete_from_heap来使其正常工作,但是,如果两个项具有相同的优先级并且选择了错误的项,则会导致问题.在我的应用程序中,这个问题通常不会出现,但看起来通常应该有一个更好的方法来使用属性变量和现有规则.
您无意中统一了具有附加于另一个术语的属性的变量.涉及属性变量的统一触发器attr_unify_hook/2在相应的模块中触发,并且您没有定义此类挂钩,因为您只使用属性作为访问数据的快速方式,并且可能对这些变量之间的任何统一没有兴趣.
要从列表中删除变量,请使用以下示例(==)/2:
list0_var_list(Ls0, V, Ls) :-
select(V0, Ls0, Ls),
V0 == V.
Run Code Online (Sandbox Code Playgroud)
示例查询:
?- list0_var_list([A,B,C,D], B, Ls).
Ls = [A, C, D] ;
false.
Run Code Online (Sandbox Code Playgroud)
请注意,这仍然留下一个选择点.您可以使用once/1提交第一个也是唯一的解决方案,因为您已经知道列表中的每个节点都是唯一的:
?- once(list0_var_list([A,B,C,D], B, Ls)).
Ls = [A, C, D].
Run Code Online (Sandbox Code Playgroud)
使用这样的谓词而不是delete/3让你安全地检测变量的相等性并从列表中删除给定的变量,而不会触发任何统一挂钩.
还要注意的delete/3是过时(请参阅文档),并考虑以下情况:
?- delete([A,B,C], A, Cs).
Cs = [].
Run Code Online (Sandbox Code Playgroud)
这表明delete/3在涉及变量时无法安全使用.
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |