PROLOG:推理过程,为什么返回false

时间:2018-06-05 17:51:51

标签: prolog inference

我有conc的定义:

conc([], L2, L2).
conc([X1|R1], L2, [X1|RN]) :-
   conc(R1, L2, RN).

我不明白为什么conc([X | green], Y, [red, green, blue]).会返回false而不是

X = [red],
Y = [blue]

这里的推理过程是什么?

2 个答案:

答案 0 :(得分:2)

免责声明:我不知道Prolog。这个答案的其余部分是一种愚蠢的猜测。

您提出的export function MyAwesomeMatcher ( url: UrlSegment[] ): UrlMatchResult { if (url.length === 0) { return null; } const reg = /^(awesome-path)$/; const param = url[ 0 ].toString(); if (param.match( reg )) { // myValue: "awesome-path" return ({ consumed: url, posParams: { myValue: url[ 0 ] } }); } return null; } // define application routes. const routes: Routes = [ { path: '', component: HomeComponent, pathMatch: 'full' }, { matcher: MyAwesomeMatcher, component: MyAwesomeComponent } ... ]; 解决方案没有意义,因为这会使X = [red]成为一个单元素列表。我们假设

X

代替。

那会给我们

X = red

使用conc([red | green], [blue], [red, green, blue]). 的第二个等式变为

conc

conc(R1, L2, RN).
% with:
% X1 = red
% R1 = green
% L2 = [blue]
% [X1|RN] = [red, green, blue]
% i.e. X1 = red
%      RN = [green, blue]

现在我们被卡住了,因为您的conc(green, [blue], [green, blue]). 规则都不适用于conc

问题是green,因为[X | green]不是列表的尾部。

您的意思是green吗?

答案 1 :(得分:1)

在Prolog列表表示法中,|将其左侧枚举的元素与其右侧剩余元素的列表分开。问题出在您的查询中。您需要[X | green][X | [green]]来代替[X,green]而不是?- conc([X | [green]], Y, [red, green, blue]). X = red, Y = [blue]. 。通过其中一个修复,您可以得到正确的答案。 E.g。

{
  "name": "cmonapp",
  "version": "1.0.0",
  "description": "APPLICATION NAME",
  "main": "start.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Meric",
  "license": "ISC",
  "dependencies": {
    "hapi-auth-jwt": "^4.0.0",
    "jsonwebtoken": "^8.2.2",
    "knex": "^0.14.6",
    "mysql": "^2.15.0"
  }
}