我需要在Prolog中编写一个谓词,在指定的位置插入一个元素,然后修改列表中其余元素的位置编号。 我所取得的是下一代代码片段,它实现了一个在列表末尾插入元素的Predicate。 在数据库领域,除了LIST之外,我们还有LONG表示列表中的元素数量。 最后,我尝试实现de谓词时有一些代码。谁能告诉我那里有什么问题? 我迷失在这里。
Domains
name=symbol
position=integer
element=integer
Database
list(name,position,element)
long(name,integer)
Predicates
nondeterm inserirf(element)
Clauses
list(b,1,1).
list(b,2,5).
list(b,3,8).
list(b,4,3).
long(b,4).
inserirf(V):-
long(b,X),
Y=X+1,
assertz(list(b,Y,V)),
assertz(long(b,Y)),
retract(long(b,X)),
long(b,Q),
list(b,Q,P),
write(P),nl.
Goal
inserirf(7).
我的最后一次尝试:
Predicates
nondeterm inserirl(nom,pos,element)
Clauses
list(b,1,1).
list(b,2,5).
list(b,3,8).
list(b,4,3).
list(b,5,10).
list(b,6,11).
long(b,6).
inserirl(L,Pos,E):-
long(L,Long),
Pos > Long,
NouLong = Long+1,
retract( long(L,Long) ),
assertz( list(L,Pos,NouLong) ),
assertz( long(L,NouLong) ).
inserirl(L,Pos,E):-
long(L,X),
XaPassar=X-1,
retract(llista(L,Pos,E)),
retract( long(L,X) ),
assertz( long(L,XaPassar) ),
inserirl(L, XaPassar,E),
long(L,Y),
Y2=Y+1,
retract( long(L,Y) ),
assertz( long(L,Y2) ),
assertz(llista(L,Pos,E)).
Goal
inserirl(b,3,9).
% 3 -> position
% 9 -> element
% b -> name of list
感谢任何帮助。
答案 0 :(得分:0)
为了帮助您入门:
答案 1 :(得分:0)
以下是基本案例:
inserirl(L,Pos,E):-
long(L,Len),
Pos > Len,
NewLen is Len+1,
retract( long(L,Len) ),
assertz( list(L,Pos,NewLen) ),
assertz( long(L,NewLen) ).
对于递归情况,更改事实以使列表1缩短,将新项目插入THAT,然后将删除的项目放回到最后。
答案 2 :(得分:0)
关于“我的最后一次尝试”:
注意:你最终会花很多时间断言&收回long()事实,你需要跟踪长度,但大多数将“取消”。一种更有效的方法是收回原始的long(),然后将长度作为参数传递,并且只有在完成后才重新断言新的long。但是在你担心优化之前让它工作!