小编Ash*_*ley的帖子

17
推荐指数
1
解决办法
1752
查看次数

NP-complete背包

我看到这个日食的解决方案中提到的问题这个 XKCD漫画.我试图将其转换为纯Prolog.

go:-
    Total = 1505,
    Prices = [215, 275, 335, 355, 420, 580],
    length(Prices, N),
    length(Amounts, N),
    totalCost(Prices, Amounts, 0, Total),
    writeln(Total).

totalCost([], [], TotalSoFar, TotalSoFar).
totalCost([P|Prices], [A|Amounts], TotalSoFar, EndTotal):-
    between(0, 10, A),
    Cost is P*A,
    TotalSoFar1 is TotalSoFar + Cost,
    totalCost(Prices, Amounts, TotalSoFar1, EndTotal).
Run Code Online (Sandbox Code Playgroud)

我不认为这是最好的/最具声明性的解决方案,人们可​​以提出.有没有人有任何改进建议?提前致谢!

prolog np-complete clpfd

10
推荐指数
2
解决办法
1178
查看次数

使用C++中的模板展开循环,并进行部分特化

我正在尝试使用模板在C++中展开循环,如下所示.

#include <iostream>

template< class T, T i >
struct printDown {
    static void run(void) {
        std::cout << i << "\n";
        printDown< T, i - 1 >::run();
    }
};

template< class T >
struct printDown< T, 0 > {
    static void run(void) {
        std::cout << 0 << "\n";
    }
};

int main(void) {
    printDown< int, 10 >::run();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我在Cygwin中编译w/g ++ 3.4.4时,我收到以下错误.

tmp.cpp:12:错误:类型T' of template argument0'取决于模板参数

我究竟做错了什么?我是否需要以某种方式注释0来说它是T型?

提前致谢.

c++ templates partial-specialization specialization loop-unrolling

6
推荐指数
1
解决办法
475
查看次数

使用prolog DCG查找和替换 - 代码审查

我想出了瓦特/下面的代码来替换出现的所有Find瓦特/ ReplaceRequest和放在答案Result.这是使用DCG,因此它们都是字符代码列表.客户端代码将使用的谓词是substitute.

findReplace(_, _, [], []) -->
    [].  % The end.
findReplace(Find, Replace, Result, ResultRest) -->
    Find,  % Found Find.
    { append(Replace, Intermediate, Result) },  % Put in Replace in Find's place.
    !,  % Make sure we don't backtrack & interpret Find as the next case.
    findReplace(Find, Replace, Intermediate, ResultRest).
findReplace(Find, Replace, [ C | Intermediate ], ResultRest) -->
    [ C ],  % Any other character.
    findReplace(Find, Replace, Intermediate, ResultRest).

substitute(Find, …
Run Code Online (Sandbox Code Playgroud)

prolog dcg

4
推荐指数
1
解决办法
959
查看次数

向量打印矢量ostream

请考虑以下代码.我正在尝试将矢量向量输出到ostream.

#include <iterator>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

template<typename T>
std::ostream &operator <<(std::ostream &os, const std::vector<T> &v) {
    using namespace std;
    copy(v.begin(), v.end(), ostream_iterator<T>(os, "\n"));
    return os;
}

int main() {
    using namespace std;
    vector<string> v1;
    cout << v1;
    vector<vector<string> > v2;
    cout << v2;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我输出字符串向量的语句有效.我输出字符串向量向量的那个没有.我正在使用g ++ 4.7.0.我试过w /&w/o -std = c ++ 11标志.在C++ 11模式下,它在半页的错误中给出了这一行.

error: cannot bind 'std::ostream_iterator<std::vector<std::basic_string<char> >, char, std::char_traits<char> >::ostream_type {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
Run Code Online (Sandbox Code Playgroud)

我不认为我理解这意味着什么.有人可以向我解释一下吗?我或多或少知道rvalue引用是什么,但我不明白为什么std::basic_ostream<char>不绑定std::basic_ostream<char>&&.也许我不太了解它.还有更好的方法吗?

提前致谢.

c++ vector ostream

4
推荐指数
1
解决办法
1万
查看次数

避免在Prolog中追加/ 3的线性成本

让我们假设我们正在读取标准输入并构建已读取的所有行的列表.最后,我们需要显示那些以逗号分隔的行.

go:-
    prompt(_, ''),
    processInput([ ], Lines),
    findall(_, (member(L, Lines), write(L), write(',')), _),
    nl.

processInput(LinesSoFar, Lines):-
    read_line_to_codes(current_input, Codes),
    processInput(Codes, LinesSoFar, Lines).

processInput(Codes, LinesSoFar, Lines):-
    ( Codes \= end_of_file
    ->
        atom_codes(Line, Codes),
        append(LinesSoFar, [ Line ], LinesSoFar1),  % <---- append/3 - O(n)
        processInput(LinesSoFar1, Lines)
    ;
        Lines = LinesSoFar ).
Run Code Online (Sandbox Code Playgroud)

这个代码的问题在于append调用processInput/3成本为O(n).我们怎样才能避免这种成本并且仍然让我们的谓词是尾递归的(因为我们可能从标准输入中读取了很多行)?

在我看来,我们可以用append以下内容代替.

LinesSoFar1 = [ Line | LinesSoFar ],
Run Code Online (Sandbox Code Playgroud)

我们可以在显示之前反转列表.但这看起来很糟糕.有没有更好的办法?

prolog dcg

3
推荐指数
1
解决办法
284
查看次数