0

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

数百人感谢任何帮助。

4

3 回答 3

0

为了让你开始:

  1. 检查插入的项目是否在最后;如果是这样,您可以使用您当前的代码。
  2. 如果它没有走到最后:删除(但记住!)当前位于末尾的那个,递归尝试插入新项目,然后将您删除的项目添加到现在结束(可以使用您的代码)。
于 2012-01-05T14:57:44.407 回答
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,然后将删除的项目放回末尾。

于 2012-01-09T01:01:02.953 回答
0

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

  1. 你为什么要收回你试图(最终)断言的清单事实?
  2. 您必须先缩短列表(即收回最后一个元素并替换长度),然后才能进行递归(因为它必须在较短的列表上工作)。

Note: You'll end up spending a lot of time asserting & retracting long() facts, which you need to keep track of the length, but most of them will "cancel out". A more efficient approach would be to retract the original long(), then pass the length around as an argument, and only re-assert the new long when you're done. But get it working before you worry about optimizing!

于 2012-01-09T16:30:28.103 回答