我有以下文件与谓词出席,这表示每个学生都参加某个课程 (第一个参数:Student_ID,第二个参数:Course_ID)。
import React, { Component } from 'react';
import Routes from './Routes'
import HomePage from './HomePage'
import {connect} from 'react-redux'
import { bindActionCreators } from 'redux'
import * as actions from '../actions/listingActions.js'
class App extends Component {
componentDidMount() {
if (this.props.listings.length === 0) {
this.props.actions.fetchListings()
}
}
render() {
return (
<div className="App">
<Routes />
console.log(this.props.listings); // old state gets printed out
<HomePage listings={this.props.listings} />
</div>
);
}
}
const mapStateToProps = (state) => {
console.log(state.listings.listings); // comes correctly
return { listings: state.listings.listings };
};
function mapDispatchToProps(dispatch) {
return {actions: bindActionCreators(actions, dispatch)}
}
const WrapperApp = connect(mapStateToProps, mapDispatchToProps)(App);
export default WrapperApp;
我想要做的是创建一个谓词函数,该函数创建一个由3个列表(A,B,C)组成的考试时间表。
每个列表代表一周。然后例如为了找到适合大多数学生的最佳时间表,它会以3-3-2的形式打印出所有不同的课程排列:
列表A是第一周,第一个案例中有attends(476, c216).
attends(478, c216).
attends(484, c216).
attends(487, c216).
attends(491, c216).
课程。
列表B是第2周等...
[c204,c209,c210]
问题1:
那么我怎样才能获取参加/ 2谓词并将第二个参数转换为List,其方式是列表将包含已声明的所有课程。
例如:?- schedule(A,B,C).
A = [c204,c209,c210],
B = [c212,c214,c216],
C = [c217,c218];
A = [c204,c209,c210],
B = [c212,c214,c216],
C = [c218,c217];
。
问题2:
排列将使用名为k_permutation / 3的自定义函数完成:
L = [c212,c213...]
但由于某种原因,这个自定义函数(k_permutation / 3)运行无限时间。函数递归有什么问题吗? 应该如何使用该功能?
答案 0 :(得分:5)
对问题1而言,简单的方法是:
collect_courses(L1):- findall(Course, attends(_,Course), L), sort(L,L1).
L
会显示attends/2
中显示的所有课程,因此会有重复项,这就是我们使用sort/2
删除重复项的原因。
至于问题2,首先Swi-Prolog已经定义了delete/3
谓词,所以我建议你重命名它。除此之外k_permutations/2
工作正常:
?- k_permutation(2,[1,2,3],L).
L = [1, 2] ;
L = [1, 3] ;
L = [2, 1] ;
L = [2, 3] ;
L = [3, 1] ;
L = [3, 2] ;
false.