Prolog - 插入事实

时间:2012-01-04 23:05:09

标签: list insert prolog fact

我需要在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

感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

为了帮助您入门:

  1. 检查插入的项目是否在最后;如果是这样,您可以使用当前的代码。
  2. 如果它不在最后:删除(但要记住!)当前最后一个,递归尝试插入新项目,然后将删除的项目添加到now-end(可以是使用您的代码完成。)

答案 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)

关于“我的最后一次尝试”:

  1. 你为什么要撤回你试图(最终)断言的列表事实?
  2. 您必须缩短列表(即缩回最后一个元素并替换长度)才能进行递归(因为它必须在较短的列表上工作)。
  3. 注意:你最终会花很多时间断言&收回long()事实,你需要跟踪长度,但大多数将“取消”。一种更有效的方法是收回原始的long(),然后将长度作为参数传递,并且只有在完成后才重新断言新的long。但是在你担心优化之前让它工作!