我是prolog中的新手,所以我做了一个程序,它有一个方法来查询某些东西,但是当我使用它时,即使它应该结束它仍然会产生结果。
import {Component,bind,CORE_DIRECTIVES} from 'angular2/core';
import {SharedService} from 'src/shared.service';
@Component({
selector: 'main-app',
template: `<h1> MainComponent</h1>
<button (click)="changeName()">Change Name</button>
`
})
export class MainComponent {
constructor(ss: SharedService) {
this.ss = ss;
}
changeName() {
this.ss.change();
}
}
例如,当我执行
时import {Component, Injectable,Input,Output,EventEmitter} from 'angular2/core'
@Injectable()
export class SharedService {
@Output() fire: EventEmitter<any> = new EventEmitter();
constructor() {
console.log('shared service started');
}
change() {
console.log('change started');
this.fire.emit(true);
}
getEmittedValue() {
return this.fire;
}
}
它应该给我这个答案:
X = omarpacheco; X = jasonancona; X = jorgebolio; X = gerardoadrian ;
但它真正做的是重复这些答案而不是像这样结束
X = omarpacheco; X = jasonancona; X = jorgebolio; X = gerardoadrian ; X = omarpacheco; X = jasonancona; X = jorgebolio; X = gerardoadrian。 。 。 。 。 。 。 。 。 。 。 。 (重复)...........
所以,这就是为什么我会重复你们的原因,我需要知道如何建立一个不让重复答案的条件。 对不起我顺便说一下我的英语不好。
我忘了说在这种情况下一定只有一个谓词&#34; amigos&#34;
答案 0 :(得分:2)
这很简单:使用两个谓词而不是一个!
第一个谓词仅包含事实:
amigos(juanarjona, omarpacheco). amigos(juanarjona, jasonancona). amigos(juanarjona, jorgebolio). amigos(juanarjona, gerardoadrian).
第二个建立在第一个之上 - 提供对称闭包 1 :
sym_amigos(X, Y) :- amigos(X, Y). sym_amigos(X, Y) :- amigos(Y, X).
使用SICStus Prolog 4.3.2的示例查询:
| ?- sym_amigos(P, Q). P = juanarjona, Q = omarpacheco ? ; P = juanarjona, Q = jasonancona ? ; P = juanarjona, Q = jorgebolio ? ; P = juanarjona, Q = gerardoadrian ? ; P = omarpacheco, Q = juanarjona ? ; P = jasonancona, Q = juanarjona ? ; P = jorgebolio, Q = juanarjona ? ; P = gerardoadrian, Q = juanarjona ? ; no
随着你的事实基础变得越来越大,查看所有具体的答案会让人厌烦......所以,要检查sym_amigos/2
是否普遍终止,我们可以运行这样的查询之一:
| ?- sym_amigos(P, Q), % looking for amigos ... false. % ... we discard every candidate solution. no % "no" means "terminates universally"
以上查询永远不会产生任何解决方案 - 毕竟,它是与目标false/0
的结合:
no
- 它确实 2 - 我们知道sym_amigos/2
普遍终止。 脚注1:
meta-predicate symm/2
涵盖了常见的成语&#34; symmetric closure&#34;。
脚注2: SWI-Prolog不回复no
,而是回复false
。
功能