我正在尝试确定Prolog列表是否具有奇数或偶数个元素。我意识到使用length/2
可能有更好的解决方案,我愿意用一个正确的答案来标记一个更好的解决方案,我只想知道我在这个例子中做错了什么。
我的代码详细如下:
oddSize([]) :-
false.
oddSize([_]).
oddSize([_,_|T]) :-
oddSize(T).
我尝试测试此代码时收到的输出是:
1 ?- oddSize([]).
false.
2 ?- oddSize([1]).
true ;
false.
3 ?- oddSize([1,2]).
false.
4 ?- oddSize([1,2,3]).
true ;
false.
似乎在检测哪些列表中包含奇数个元素,但为什么我会得到false
的额外结果?
答案 0 :(得分:4)
请注意,您可以定义一个最多成功一次的 var express = require('express');
var app = express();
app.get('/download/:fileName/:extension', function(req, res){
var file = __dirname + '/' + req.params.fileName + '.' + req.params.extension;
res.download(file, function(err){
if (err) {
res.sendStatus(404);
}
res.end();
});
});
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('app listening at http://%s:%s', host, port);
});
谓词,即不留任何选择点(*):
odd_size/1
(*)假设您的Prolog系统使用第一个参数索引(对于现代系统是true),这避免了在使用实例化参数调用odd_size([_| Tail]) :-
even_size(Tail).
even_size([]).
even_size([_| Tail]) :-
odd_size(Tail).
谓词时创建选择点。
一些示例查询:
even_size/1
答案 1 :(得分:1)
在我看来,你的代码是正确的,我认为你只是误解了Prolog的输出。我已经在stackoverflow上找到了其他人的更全面的回复,并将其链接到下面。对不起,我是stackoverflow的新手,所以我不知道如何最好地链接它。
"这个答案是对的。在Prolog中,您的事实是规则的编写顺序决定了查询将找到它们的顺序。更具体地说,'回溯'选项";"本质上告诉强制查询引擎丢弃返回的结果并回答问题"还有其他答案吗?"。所以,并不是f(a,b)既是真的又是假的;但它确实如此,如果您选择忽略该结果,引擎将告诉您没有其他f(a,b)事实条目。为了证明这一点,请观察如果添加第二个f(a,b)事实会发生什么。" - Assaf Jul 24' 10 at 2:17