错误信息是这个E;Test_Goal, pos: 203, 416 Comparison operator expected. I.e. one of = < <= >= >< <>代码是这个Predicates road(symbol,symbol) path(symbol,symbol) Clauses road(a,b). road(a,c). road(b,d). road(c,d). road(d,e). road(b,e). path(X,Y):-road(X,Y). path(X,Y):-road(X,Z),path(Z,Y). Goal run:-path(a,X),write("X=" ,X),nl,fail. run.希望实现的功能是这个:使其能输出图中所有路径(path)。
时间: 2024-03-14 17:47:54 浏览: 130
好的,根据你的代码和要求,我进行了一些修改和补充,你可以参考以下代码:
```
% Predicates
road(symbol, symbol).
path(symbol, symbol).
% Clauses
road(a, b).
road(a, c).
road(b, d).
road(c, d).
road(d, e).
road(b, e).
path(X, Y) :- road(X, Y).
path(X, Y) :- road(X, Z), path(Z, Y).
% New clauses to find all paths
all_paths(X, Y, P) :- path(X, Y), P = [X, Y].
all_paths(X, Y, P) :- path(X, Z), all_paths(Z, Y, P1), P = [X | P1].
% Goal
run :- all_paths(a, e, P), write(P), nl, fail.
```
在这个版本的代码中,我添加了一个新的谓词 `all_paths`,它可以找到从一个点到另一个点的所有路径并将其存储在列表中。我们可以使用这个谓词来输出所有的路径。在 `run` 的目标中,我使用 `all_paths(a, e, P)` 来查找从 `a` 到 `e` 的所有路径,将它们写入到输出中,并使用 `fail` 使得 Prolog 回溯并继续查找更多的路径。
相关问题
Runtime Error 2.104505ms 404KiB foo.cc: In function 'bool check1(std::string)': foo.cc:16:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare] 16 | for(int i=1; i<s.size();i++) | ~^~~~~~~~~ foo.cc: In function 'bool check2(std::string)': foo.cc:24:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare] 24 | for (int i = 0; i < s.size(); i++) | ~~^~~~~~~~~~ foo.cc: In function 'int main()': foo.cc:54:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare] 54 | for (int i = 0; i < s.size()- 1; i++) | ~~^~~~~~~~~~~~~ foo.cc:59:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare] 59 | while(j < s.size() && s[j] >= '0' && s[j] <= '9') n = n * 10 + (s[j++] - '0'); | ~~^~~~~~~~~~ foo.cc:79:9: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare] 79 | while(j < s.size() && isdigit(s[j])) n = n * 10 + (s[j++]-'0'); | ~~^~~~~~~~~~ ExitCode: 11 (Segmentation fault)
非常抱歉,我之前提供的修正代码仍然有问题。根据您提供的错误信息,看起来可能是由于数组越界导致的段错误。经过仔细检查,我发现在代码中有一处错误。
请将以下两处代码:
```cpp
for (int i = 0; i < s.size()- 1; i++)
```
修改为:
```cpp
for (int i = 0; i < s.size(); i++)
```
这样修改后,代码应该可以正常执行,而不会出现段错误。
另外,还需要对 `check1` 函数中的循环条件进行修改。将 `i < s.size()` 修改为 `i < s.size() - 1`,这样可以避免比较越界。
再次感谢您的耐心和指出问题的细节。如果您还有其他问题,请随时提问。
Accepted 2.01955ms 404KiB foo.cc: In function 'std::string infixToPostfix(std::string)': foo.cc:19:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare] 19 | for (int i = 0; i < expression.length(); i++) { | ~~^~~~~~~~~~~~~~~~~~~~~
很抱歉,我之前提供的解决方案还是没有解决警告问题。尽管代码功能正常运行,但警告仍然存在。
要解决这个警告,可以将循环变量 `i` 的类型更改为无符号整数类型 `size_t`,这是 `expression.length()` 函数的返回类型。这将确保变量类型一致,消除警告。
以下是修改后的代码:
```cpp
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int precedence(char op) {
if (op == '+' || op == '-')
return 1;
if (op == '*' || op == '/')
return 2;
return 0;
}
string infixToPostfix(string expression) {
string postfix = "";
stack<char> stk;
stk.push('#');
for (size_t i = 0; i < expression.length(); i++) {
char c = expression[i];
if (isalnum(c)) {
postfix += c;
} else if (c == '(') {
stk.push('(');
} else if (c == ')') {
while (stk.top() != '#' && stk.top() != '(') {
postfix += stk.top();
stk.pop();
}
stk.pop();
} else {
while (stk.top() != '#' && precedence(c) <= precedence(stk.top())) {
postfix += stk.top();
stk.pop();
}
stk.push(c);
}
}
while (stk.top() != '#') {
postfix += stk.top();
stk.pop();
}
return postfix;
}
int main() {
string expression;
cin >> expression;
string postfix = infixToPostfix(expression);
cout << postfix << endl;
return 0;
}
```
请再次运行代码,看看警告是否消失。如果您还有其他问题,请随时提问。
阅读全文