如何判断Prolog

时间:2015-12-05 21:12:06

标签: prolog

我正在尝试确定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的额外结果?

2 个答案:

答案 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

来源: Why is this prolog query both true and false?