Prolog Permutations调度

时间:2018-05-07 16:54:10

标签: recursion prolog scheduling planning

我有以下文件与谓词出席,这表示每个学生都参加某个课程  (第一个参数: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)运行无限时间。函数递归有什么问题吗? 应该如何使用该功能?

1 个答案:

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