我现在已经在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).
。我不知道我的代码有什么问题。任何提示都表示赞赏。
答案 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