Prolog - 比较在同一索引上具有相同元素的列表

时间:2017-04-11 00:27:19

标签: prolog

我现在已经在Prolog工作了几个星期。我现在正在尝试在其中编写一个名为matching的函数:

  

编写一个名为match的谓词,其中包含三个参数,即所有列表。   第三个列表必须包含其中的位置索引   前两个列表包含相同的值。

如果我跑

--Create Holding Table
Declare Table #Items 
(
    itemID varchar(20)
    ,itemName varchar(100)
    ,qty int
    ,storeID int
)
--Insert Some Sample Data
Insert Into #Items (itemID, itemName, qty, storeID) Values
('CZ100', 'Coke Zero', 4, 123), ('CZ100', 'Coke Zero', 3, 201)
,('CZ200', 'Cherry Coke Zero', 4, 311), ('CC100', 'Coca-Cola', 6, 400)
,('CC100', 'Coca-COla', 8, 500)
--Select data that needs to be split into secondary table
Select storeID, Qty Into #NeedExtra from #Items WHERE itemID = 'CC100'
--Declare variables
Declare @storeID int, @Qty int
--Create Cursor
DECLARE cursor1 CURSOR FOR
--Select statement to insert into variables
  SELECT 
  storeID, qty
  FROM #NeedExtra

  OPEN cursor1
  --Iterate cursor
  FETCH NEXT FROM cursor1 INTO @storeID, @qty
  --Continue as long as cursor is not empty
  WHILE @@FETCH_STATUS = 0
  BEGIN
    --Insert Values
    Insert Into #Items (itemID, itemName, qty, storeID) Values
    Select @storeID, 'CC200', 'Coca-Cola Syrup', @Qty, @storeID FROM #NeedExtra
  --Grab next item from temp table
  FETCH NEXT FROM cursor1 INTO @storeID, @qty

END
--Close cursor
CLOSE cursor1
--Deallocate cursor
DEALLOCATE cursor1
--Select statements
Select * FROM #NeedExtra
SELECT * FROM #Items

结果是:

<script>
    $("#file-1").fileinput({
        uploadUrl: '#', // you must set a valid URL here else you will get an error
        allowedFileTypes: ['image', video'],
        allowedFileExtensions: ['jpg', 'png', 'gif'],
        uploadAsync: false,
        initialPreview: false,
        maxFileCount: 100,
        showBrowse: false,
        previewFileType: "image",
        browseOnZoneClick: true,
        overwriteInitial: false,
        maxFileSize: 1000,
        showUpload: false,
        maxFilesNum: 100,
        showRemove: true,
        showUpload: false,
        removeClass: "btn btn-danger"
    }); 
</script>

正确的答案是,职位绑定到matching([10,71,83,9,24,5,2],[8,71,26,9],Positions). 。我不知道我的代码有什么问题。任何提示都表示赞赏。

1 个答案:

答案 0 :(得分:3)

提示?您的每个matchingHelper条款都包含错误!

好的,多一点提示:

基本案例

Prolog应该在这里给你一个关于单身变量的警告。 ListofIndex是一个变量,但它只在一个地方使用。从本质上讲,这意味着对此绝对没有约束,因此可以是任何东西。

正确的做法是,如果任一输入列表为空,则输出也为空。

matchingHelper([],_,,[])。 matchingHelper(,[],_,[])。

平等案例

这个你几乎是正确的,但你处理ListOfIndex的方式是倒退的。您基于谓词参数构造NewListOfIndex,并在递归调用中使用它。问题是ListOfIndex实际上是输出!因此,您应该根据递归调用的输出构造ListOfIndex

matchingHelper([X|Xs], [X|Ys], Index, [Index|ListofIndex]) :-
    Index2 is Index + 1,
    matchingHelper(Xs, Ys, Index2, ListofIndex).

不等的案例

这个问题只有两个小问题。首先,该条款仅适用于X和Y不同的情况。仅使用不同的变量名称不会强制执行此操作。因为有一个先前的句子处理相同的情况,prolog发现的第一个结果是正确的,但由于这个原因,它会继续找到其他不正确的解决方案。

第二个问题是你没有增加索引。如果忽略第一个元素,则必须递增当前索引以反映当前位置。

matchingHelper([X|Xs], [Y|Ys], Index, ListofIndex) :-
    X \= Y,
    Index2 is Index + 1,
    matchingHelper(Xs, Ys, Index2, ListofIndex).

这是一个示例运行:

?- matching([10,71,83,9,24,5,2],[8,71,26,9],Positions).
Positions = [1, 3]
false